코어데이터는 객체를 저장소에 세부정보를 추상화하
직접적으로 데이터베이스를 운영하지 않고 Objective-C와 Swift로 데이터를 쉽게 저장할 수 있게 만든다.
CoreData의 undo manager는 변경 사항을 추적하고 한번에 모두, 그룹단위로, 개인별로 다시 되돌릴 수 있어서 앱에 Undo 및 Redo를 쉽게 추적할 수 있다.
Background에서 Json을 Object로 파싱하는것과 같은 데이터 작업들을 수행한다. 서버로 반복된 요청을 줄이기 위한 결과들을 저장하거나 cache처리할 수 있다.
CoreData는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화상태로 유지하는 것을 제공한다.
Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있다.
AppDelegate에서 Persistent Container을 lazy변수로 생성하여 첫번째 사용이 발생때 까지 인스턴스화를 늦춰야 한다.
NSPersistenceContainer
인스턴스를 lazy var으로 선언class AppDelegate: UIResponder, UIApplicationDelegate {
...
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Unable to load persistent stores: \(error)")
}
}
return container
}()
...
}
생성되고 나면 persistent container는 model, context, store coordinator 인스턴스를 각각 managedObjectModel
, viewContext
, persistentStore Coordinator
레퍼런스를 가지고 있다.
NSPersistentContainer는 subclass되도록 의도되었다. data의 subset을 불러오거나 disk에서 영구 데이터를 불러오는 등의 함수처럼 Core Data관련된 코드를 작성하기 좋다.
import CoreData
class PersistentContainer: NSPersistentContainer {
func saveContext(backgroundContext: NSManagedObjectContext? = nil) {
let context = backgroundContext ?? viewContext
guard context.hasChanges else { return }
do {
try context.save()
} catch let error as NSError {
print("Error: \(error), \(error.userInfo)")
}
}
}