티스토리 뷰
안녕하세여
제가 과거에 CoreData에 대한 글을 쓴 적 있어요, ( https://milyo-codingstories.tistory.com/2 )
조금 더 보안하고자 다시 글을 잡습니다..
4월달의 저니까..완전 초짜일때 적은거네요
지금도 초짜지만 저때는 더 초짜였던..
자그럼 바로 시작하겠습니다
https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack?changes=_7
Setting Up a Core Data Stack | Apple Developer Documentation
Article Setting Up a Core Data Stack Set up the classes that manage and persist your app’s objects. OverviewAfter you create a data model file as described in Creating a Core Data Model, set up the classes that collaboratively support your app’s model laye
developer.apple.com
cmd + N 을 누르고
적당한 Data Mdoel을 만들어 줍니다.
그러고 나서 적당한 엔티티를 넣어줍니다.
이제부터 CoreDataStack을 직접 만들예정입니다.
전 싱글톤으로 만들었는데
선택의 여러분의 몫이라 생각합니다
이렇게 만들어주고 시작하겠습니다
먼저 만들 놈은... NSManagedObjectModel 입니다
NSManagedObjectModel은
앱의 유형, 속성 및 관계를 설명하는 앱의 모델 파일 입니다.
이렇게 초기화해서 사용합니다.
forResource에는 DataModel의 파일명이 들어갑니다.
( xcdatamodeld 확장자를 가진 그 파일 입니다. )
momd는 xcdatamodeld 컴파일되면 저런 확장저가 된다네요
그 다음에 살펴볼 파일은 NSPersistentStoreCoordinator 입니다
이거에 대한 설명으 저 위에 과거에 제가 쓴 글을 참고해주세요.
ofType에는 종류가 4가지 정도 있습니다
이 정도 타입이 있습니다
주의하실껀 InMemory타입은 앱이 종료되면 사라집니다.
보통 캐시용도로 많이 사용한다고 알고 있습니다.
그 다음 만들어야하는건
NSManagedObjectContext 입니다.
사실 코어데이터에서 얘를 작업단위로 생각하시면 편합니다.
context.save...context.perform...등등
특히 얘는 변경사항을 추적하는 ? 그런 역할도 있습니다.
이렇게 만들어주면 됩니다.
지금 만든 context는 메인큐 이므로
나중에 저장하거나 fetch할 때는 새로 하나 만들어서 하는 게 좋습니다.
안그러면 전부 메인에서 돌껀데...음..좋진 않겠죠?
그래서 automaticallyMergesChangesFromParent를 넣어줍니다.
managedObjectcontext는 엥 이 놈은 부모가 없는데? 하실 수 있는데
( 음..어...부모가 없다니 어감이 좀 그렇네요 )
부모를 지정해주지 않았지만 이 경우엔
CoreDataExample.sqlite가 부모입니다.
쉽게 생각하면 다른 context를 생성해서
그 context에서 새 데이터를 생성해서
저장하면 저장이 되겠죠?
그럼 부모(CoreDataExample.sqlite)가 바뀌니까
나(managedObjectcontext)한테 자동으로 합쳐줘 그런 기능을 하는겁니다.
( 더 쉽게 생각하면 context마다 자기만의 세계를 가지고 있다고 생각하면 됩니다. )
( AContext, BContext가 있다고 치면 두 context는 부모는 같지만 서로 다른 세계에 삽니다 )
( BContex가 사는 세계에선 새데이터가 생성되어 부모에게 저장했습니다 )
( 그럼 AContext가 사는 세계도 부모에 따라바뀌어야하니까'
여러가지 방법 중 automaticallyMergesChangesFromParent를 사용한거죠 )
( 부모가 바뀌으면 나한테 머지해줘 )
자 이제 실제 코드에 적용해보겠습니다,
오늘도 뷰가 먼저 나오겠습니다.
+ 버튼을 누르면 셀 아이템이 추가되고
왼쪽에 리로드 버튼 누르면 테이블뷰가 리로드 되게 하겠습니다
그럼 fetch하는 코드부터 가지고 오겠습니다.
여기서 주의할 점은
저 excute는 NSManagedObjectContext가 필요합니다
근데 인자로 따로 받지도 않아서 그냥 실행하면 fetch 안되실꺼니
저렇게 perform해주시면 됩니다.
그리고 저기 저 Movie는 아까 우리가 코어데이터에서 생성한 엔티티입니다.
에러가나면 코드 지우시고 빌드한번 해보시고
그래도 안뜨면 엑스코드를 꺼다키시면 아마 될껍니다.
( 빌드하면서 자동으로 만들어주는 거든요 )
어디까지나 참고로 말씀드리지만
저놈은 이렇게 생겼습니다.
( 직접 안만드셔도 됩니다 )
여기서 Codegen이 Class Definition이므로
만들어주면 에러날껍니다.
( 저 파일이 두개가 되어버리니까. )
직접 만들고 싶으시면..저걸 메뉴얼로 바꾸시고 하시면 됩니다.
다시 본론으로 돌아와서
이번에는 추가를 만들어봅시다.
이렇게 context를 하나 만들어서 이렇게 저장해주시면 됩니다,
여기서는 왜 perform을 하는거죠 라고 물으시면..
우리가 지정한 저 큐 타입을 지켜주기 위해서 그렇습니다.
저걸 아무리 privateQueueConcurrencyType라고 해도..
perform을 안해준 상태인데
저 코드 플로우가 메인에서 실행되는 코드면 의미가 없습니다..
그러므로 perform을 적어주세요.
수정은 다음과 같이 하시면 됩니다.
같은 맥락이니 설명은 안하겠습니다.
자 다되었습니다.
차근차근 따라하시면 잘될껍니다.
참고로 다음 시간엔
이것보다 훨씬 편한 방법을 포스팅하겠습니다.
예제소스 입니다.
https://github.com/dp221125/CoreData_Example
dp221125/CoreData_Example
Contribute to dp221125/CoreData_Example development by creating an account on GitHub.
github.com
'Swift&IOS' 카테고리의 다른 글
Swift의 메모리 관리 - ARC 001 (0) | 2019.10.21 |
---|---|
iOS13 바뀐 UIModalPresentationStyle에 관해서.. (0) | 2019.10.02 |
NotificationCenter (0) | 2019.10.01 |
@discardableResult (0) | 2019.09.24 |
KVO로 MVVM을 짜본다면? (0) | 2019.09.09 |
- Total
- Today
- Yesterday
- 텔큐온
- MVC
- SEQUENCE
- 스유
- UIViewControllerRepresentable
- SwiftUI
- Apple
- 스위프트
- BBIK
- swift
- Queue
- Just
- ErrorHandling
- ios
- 알고리즘
- compactMap
- 결합연산자
- combine
- 콤바인
- 유니온파인드
- iOSCombine
- 스택뷰
- 자료구조
- CombineLatest
- 현업이그리운
- replaceNil
- AutoLayout
- 삨
- programmers
- 스위프트유아이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |