NSManagedObjectModel
앱에서 사용하는 data model, data model이 가질 수 있는 properties, data model 사이의 relationships을 나타내며 RDB에서의 database schema라고 생각할 수 있다.
*NSManagedObjectModel 과 data model editor의 관계?
1. editor로 xcdatamodel 파일을 만들고 편집한다.
2. momc(컴파일러)가 model 파일들을 담고 있는 momd폴더로 컴파일해준다.
3. CoreData가 momc에 의해 컴파일된 momd 폴더를 사용해 런타임때 NSManagedObjectModel를 초기화한다
NSPersistentStore
storage method를 사용하여 데이터를 읽거나 쓴다.
CoreData는 4종류의 NSPersistentStore를 제공한다. (3종류의 atomic persistent store와 non atomic persistent store)
*atomic persistent store vs non - atomic persistent store
- atomic persistent store는 읽거나 쓰기 위해서 완벽하게 메모리에 로드되어야 한다.( 메모리를 많이 사용함)
- non - atomic persistent store는 필요에 의해 chunk단위로 로드하여 사용할 수 있다. (필요한 만큼만 메모리를 사용함)
1. NSSQLiteStoreType
- SQLite database를 사용한다.
- 코어데이터가 지원하는 유일한 non-atomic store로 가볍고 효과적으로 메모리 관리를 할 수 있다.
- iOS프로젝트에 가장 적합한 선택으로 Xcode의 Core Data template에서 사용하는 기본 타입
2. NSXMLStoreType
- XML file을 사용한다.
- 사람이 읽기 쉽다.
- atomic store이므로 메모리를 많이 사용한다.
- OS X에서 사용한다.
3. NSBinaryStoreType
- binary data file을 사용한다.
- atomic store로 마찬가지로 메모리를 많이 사용한다.
- 가장 드물게 사용하는 방식이다.
4. NSInMemoryStoreType
- persistent store가 아니라서 앱이 종료되면 데이터가 in-memory에서 없어지게 된다.
- 코어데이터 목적과 어긋나는 것처럼 보이지만 testing과 caching에 사용되기도 한다
*incremental store API를 통해 직접 backing store를 제공할 수 있다
NSPersistentStoreCoordinator
managed object model 과 persistent store사이의 연결다리 역할을 한다.
persistent store와 store configuration의 implementation을 숨겨 NSManagedObjectContext가 SQLite에 저장할지, XML file에 저장할지와 같은 정보를 몰라도 되게 하며 또한 만약 여러개의 persistent store를 사용하고 있다면 NSPersistentStoreCoordinator가 managed object context에 통합 인터페이스를 제공하게 한다.( managed context는 항상 하나의 persistent store와 상호작용한다)
NSManagedObjectContext
- context는 managed object와 작업하는 in-momory scrachpad이다.
- context와 모든 core data object와의 작업을 수행한다
- save() 메서드를 호출하기 전까지는 어떤 변화도 disk에 저장되지 않는다
- context는 객체가 생성되거나 fetch되어질때 라이프 사이클을 관리한다. 이를 통해 faulting, inverse relationship handling, validation을 할 수 있다.
- managed object는 연결된 context 없이 존재할 수 없다. 매우 강하게 연결되어 있어 managed object는 항상 context의 reference를 참조하고 있다
let managedContext = zoo.managedObjectContext // 다음과 같이 접근 가능
- managed object가 특정 context와 연결되면 생명주기 동안 같은 context와 연결된 상태를 유지하게 된다.
- 애플리케이션은 하나 이상의 context를 가질 수 있다. context는 disk에 있는 내용을 위한 in-memory scratch pad 이므로 실제로 동일한 Core Data object를 두 개의 다른 context에 동시에 로드할 수 있습니다.
- context와 managed object는 thread-safe 하지않기 때문에 이들이 생성된 동일한 thread에서만 context와 managed object에 상호 작용할 수 있다.
NSPersistentContainer
iOS10 부터 위의 4가지 클래스를 조작하는 NSPersistentContainer 클래스를 제공한다.
따라서 우리는 4개의 stack 컴포넌트를 모두 연결하기 위해 삽질 하지 않고 그냥 NSPersistentContainer를 초기화하고 저장소를 로드하면 된다.
@available(iOS 10.0, *)
open class NSPersistentContainer : NSObject {
open var name: String { get }
open var viewContext: NSManagedObjectContext { get }
open var managedObjectModel: NSManagedObjectModel { get }
open var persistentStoreCoordinator: NSPersistentStoreCoordinator { get }
// Creates a container using the model named `name` in the main bundle
public convenience init(name: String)
public init(name: String, managedObjectModel model: NSManagedObjectModel)
// Load stores from the storeDescriptions property that have not already been successfully added to the container. The completion handler is called once for each store that succeeds or fails.
open func loadPersistentStores(completionHandler block: @escaping (NSPersistentStoreDescription, Error?) -> Void)
}