我正在阅读objc.io核心数据书,他们使用以下代码来设置其持久性容器:
func createContainer(completion: @escaping (NSPersistentContainer) -> ()) {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _,error in
guard error == nil else { fatalError("Unable to load persistent store: \(error!)") }
DispatchQueue.main.async { completion(container) }
}
}
(摘自第1章,示例here)
他们添加了一个空白的占位符视图控制器作为初始视图控制器,并在容器加载后使用AppDelegate.swift
中的以下代码将其替换为根视图控制器:
func application(_:didFinishlaunchingWithOptions:) -> Bool {
createContainer { container in
self.persistentContainer = container
let storyboard = self.window?.rootViewController?.storyboard
guard let vc = storyboard?.instantiateViewController(withIdentifier: "RootVC") as? RootVC
else { fatalError("Cannot instantiate root view controller") }
vc.managedobjectcontext = container.viewContext
self.window?.rootViewController = vc
}
return true
}
与苹果公司在其Core Data documentation中建议的方式相比,这样做有什么好处:
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
}()
我更喜欢Apple的方式,因为它不需要创建占位符视图控制器就可以将占位符VC与应用程序的根VC交换出去。 objc.io的方式是否过时?与使用懒惰的var而不等待回调来返回容器相比,等待回调完成有好处吗?