TIL
🌱 난 오늘 무엇을 공부했을까?
- NSPersistentContainer는 iOS 10.0 이상 및 macOS 10.12 이상에서 지원됩니다.
- 이전 대상에 배포하는 경우 NSManagedObjectModel, NSPersistentStoreCoordinator 및 하나 이상의 NSManagedObjectContext를 수동으로 인스턴스화해야 합니다.
📍 Create a Managed Object Model
NSManagedObjectModel을 인스턴스화하려면 .xcdatamodeld 파일의 컴파일된 버전을 가리키는 URL을 전달합니다.
- .momd 파일은 일반적으로 앱 번들의 일부입니다.
guard let modelURL = Bundle.main.url(forResource: "DataModel",
withExtension: "momd") else {
fatalError("Failed to find data model")
}
guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Failed to create model from file: \(modelURL)")
}
📍 Create a Persistent Store Coordinator
다음으로 로드된 managedObjectModel을 NSPersistentStoreCoordinator 이니셜라이저에 전달하여 managedObjectModel과 연결된 store coordinator를 생성합니다.
let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
📍 Add a Persistent Store
- Core Data가 데이터 모델을 디스크에 유지하기를 원하면 Store Coordinator에게 파일이 저장 될 위치와 사용할 형식을 알려주십시오.
let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
let fileURL = URL(string: "DataModel.sql", relativeTo: dirURL)
do {
try psc.addPersistentStore(ofType: NSSQLiteStoreType,
configurationName: nil,
at: fileURL, options: nil)
} catch {
fatalError("Error configuring persistent store: \(error)")
}
📍 Create a Managed Object Context
- NSManagedObjectContext를 만들고 persistentStoreCoordinator을 설정합니다.
let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
moc.persistentStoreCoordinator = psc
📍 함수화
lazy var context: NSManagedObjectContext = configurationPersistentStoreCoordinator()
func configurationPersistentStoreCoordinator() -> NSManagedObjectContext {
guard let modelURL = Bundle.main.url(forResource: "JokeDataModel",
withExtension: "momd") else {
fatalError("Failed to find data model")
}
guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Failed to create model from file: \(modelURL)")
}
let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
let dirURL = FileManager.default.urls(for: .cachesDirectory,
in: .userDomainMask).last
let fileURL = URL(string: "Joke.sql", relativeTo: dirURL)
do {
try psc.addPersistentStore(ofType: NSSQLiteStoreType,
configurationName: nil,
at: fileURL, options: nil)
} catch {
fatalError("Error configuring persistent store: \(error)")
}
let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
moc.persistentStoreCoordinator = psc
return moc
}
🔗 저장소 위치 설정
for: .cachesDirectory
의 설정으로 저장소 위치를 설정한다.
let dirURL = FileManager.default.urls(for: .cachesDirectory,
in: .userDomainMask).last