Swift - как передать контекст управляемого объекта различным контроллерам представления - PullRequest
3 голосов
/ 27 апреля 2019

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