Я поместил стек данных ядра в отдельный файл, как показано ниже.Я прочитал, что использование внедрения зависимостей - лучший способ передать контекст управляемого объекта.Таким образом, в каждом из нескольких 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.Я видел, что moc прошел с помощью didSet, но это тоже не совсем правильно.
CoreData Stack
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)")
}
}
}