Как мне инициализировать постоянный контейнер Core Data в AppDelegate и использовать его во всем приложении? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь использовать NSPersistentContainer в нескольких контроллерах представления во всем приложении для Core Data.

Первоначально я настроил контейнер в одном контроллере представления, который работал нормально:

Контроллер первого просмотра

var container: NSPersistentContainer!

container = NSPersistentContainer(name: "MyCoreData")
container.loadPersistentStores { storeDescription, error in
    self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

    if let error = error {
        print("Unresolved error \(error.localizedDescription)")
    }
}

Но я перенес этот код в AppDelegate в соответствии с документацией Apple :

AppDelegate

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "MyCoreData")
        container.loadPersistentStores { description, error in
            container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if let firstVC = window?.rootViewController as? FirstViewController {
            firstVC.container = persistentContainer
        }
        
        if let secondVC = window?.rootViewController as? SecondViewController {
            secondVC.container = persistentContainer
        }
        
        return true
    }
}

Каждый из моих контроллеров представления теперь имеет переменную с именем container типа NSPersistentContainer. Однако, когда я загружаю контроллеры представления, я получаю следующую ошибку:

Неожиданно обнаружено nil при неявном разворачивании необязательного значения

Эта ошибка указывает на то, где container.viewContext . Более конкретно:

fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: container.viewContext, sectionNameKeyPath: "title", cacheName: nil)

Я не уверен, что получаю сообщение об ошибке от rootViewController, потому что у меня нет единого контроллера представления root из-за того, что я использую Контроллер панели вкладок.

1 Ответ

0 голосов
/ 02 августа 2020

Мое предложение - это ленивый экземпляр вычисляемое свойство в расширении UIViewController, и на самом деле вам нужен только контекст управляемого объекта.

extension UIViewController {

    var context : NSManagedObjectContext {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        return appDelegate.persistentContainer.viewContext
    }
}

Вы также можете добавить save функция.

...