Я пытаюсь разобраться в NSManagedObjectContext для базовых данных.Xcode 10.1 предоставляет довольно много стандартного шаблона, если флажок Core Data установлен при создании нового проекта.Но я нахожу это немного запутанным в отношении того, как задан текущий контекст для каждого контроллера представления.Я думаю, что у меня есть лучший способ, и я ищу совет, чтобы подтвердить или вернуть меня на правильный путь.
Например, в шаблонном коде AppDelegate, didFinishLaunchingWithOptions предоставляет контекст для MasterViewController следующим образом:
let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController
let controller = masterNavigationController.topViewController as! MasterViewController
controller.managedObjectContext = self.persistentContainer.viewContex
В MasterViewContoller первое использование контекста выбирает его из fetchedResultsController ANDесть код для сохранения контекста, хотя в AppDelegate уже есть функция saveContext (), позволяющая сделать то же самое:
@objc
func insertNewObject(_ sender: Any) {
let context = self.fetchedResultsController.managedObjectContext
let newEvent = Event(context: context)
// If appropriate, configure the new managed object.
newEvent.timestamp = Date()
// Save the context.
do {
try context.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
В моем приложении с несколькими контроллерами представления я допустил ошибки, пытаясь-объявить или передать контекст в каждом месте, где это необходимо, поэтому пришлось столкнуться с ошибками, которые были вызваны непреднамеренным использованием более чем одного контекста.
Итак, мой вопрос заключается в следующем: я делаю ошибку или есть какой-то недостаток в следующем подходе:
1) Сделайте AppDelegate одиночным:
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
var window: UIWindow?
static let shared = AppDelegate()
…
2) В каждом классе, где это необходимо, всегда определяйте контекст (я предполагаю, что мне нужен только один) следующим образом:
let context = AppDelegate.shared.persistentContainer.viewContext
3) Всякий раз, когда необходимо сохранить контекст, делайте это так:
AppDelegate.shared.saveContext()
Это кажется намного проще, понятнее и менее подвержено ошибкам, и, похоже, работает в моей реализации.Есть ли проблемы с этим, которых я не вижу?