我将核心数据栈放在自己的文件中,如下所示。我读到使用依赖注入是传递托管对象上下文的最佳方法。因此,在少数几个VC中,我声明以下属性:
var managedObjectContext: NSManagedObjectContext?
现在,棘手的部分是将moc从我的堆栈中移到不同的VC。对于单身人士来说,这似乎是个好地方,但是假设这是个坏主意,我想我会在CoreDataStack中使用以下代码:
let controller = self.window!.rootViewController as! ViewController
let context = self.persistentContainer.viewContext
controller.managedObjectContext = context
但是,这使我有几个问题:
1)我应该在CoreDataStack
中的哪个位置包含以上代码?在App Delegate
中,它将在didFinishLaunchingWithOptions
中使用,但是现在这不是一个真正的选择。
2)为需要上下文的每个vc编写上面的代码似乎很糟糕。我想我可以遍历所有VC。我也看到过使用didSet通过的moc,但这也不是很正确。
CoreData堆栈
class CoreDataStack {
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Model")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}