Я читал в нескольких местах (например, ответ с высокими оценками здесь ), что полезно сделать основной управляемый контекст дочерним по отношению к фоновому управляемому контексту, чтобы сэкономить время save () и улучшить отзывчивость пользовательского интерфейса.
Persistent Store Coordinator
↑
Managed Object Context (for saving) <= note this
↑
Managed Object Context (main)
↑
Managed Object Context (for editing)
Но проблема в том, что основной управляемый контекст, созданный кодом шаблона iOS, связан с Координатором сохраняемого хранилища, и, похоже, не существует поддерживаемого способа изменить это. Я попробовал следующий код:
lazy var persistentContainer: NSPersistentContainer = {
// Template code: create persistent container
// ...
// My code
let saveMOC = container.newBackgroundContext()
container.viewContext.persistentStoreCoordinator = nil
container.viewContext.parent = saveMOC
return container
}()
, но получил NSException:
uncaught exception 'NSInternalInconsistencyException', reason: 'Context already has a coordinator; cannot replace.'
Мои вопросы:
1) Значит ли это, что реализация архитектуры выше , Я не могу использовать NSPersistentContainer и должен настроить стек основных данных с моим собственным кодом?
2) Учитывая, что NSPersistentContainer - это новый API, я думаю, что он должен иметь какой-то способ для достижения того же эффекта ( сохранение изменений управляемого объекта в фоновом потоке). Интересно что это? Я думаю о следующем подходе, где save () вызывается только в контексте сохранения, а не в основном контексте. Но он более сложный и не такой естественный, как описанный выше. Есть ли более простой подход?
Persistent Store Coordinator
↑ ↑
Context (main) --merge--> Context (saving)
↑
Context (editing)
ОБНОВЛЕНИЕ : если подумать, этот подход не работает, потому что слияние основано на уведомлении. Если save () не вызывается в главном контексте, никаких уведомлений не будет.
Хмм, мне интересно, можно ли создать еще один NSManagedObjectContext из mainQueueConcurrencyType, настройте его так, как я это делал изначально как, а затем заменить созданный NSPersistentContainer на него?
Спасибо за любые предложения.