У меня есть вопрос об обработке родительского и дочернего элементов NSManagedObjectContexts
.
Я сделал основной контекст (один XCode, автоматически устанавливаемый в проекте CoreData
) доступным следующим образом: App.managedObjectContext
Скажем, я создаю дочерний элемент context
для использования в подробном представлении, которое показывает и редактирует некоторые данные, например:
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
context.parent = App.managedObjectContext
context.automaticallyMergesChangesFromParent = true
let detailVC = DetailVC(context: context)
// present(...)
Скажем, внутри detailVC
, который вы хотитевносить изменения глобально (чтобы App.managedObjectContext
был изменен и изменения были объединены в созданный дочерний контекст)
Я мог бы просто сделать это следующим образом:
// Example: App.managedObjectContext.delete(/*some object*/)
try? App.managedObjectContext.save()
Это работает и измененияобъединены в дочерний контекст.Но это выполняет сохранение в основной очереди.Разве я не должен всегда менять вещи в фоновой очереди?Мой обычный подход:
// Get the persistent container whose `viewContext` is App.managedObjectContext
App.appDelegate.persistentContainer.performBackgroundTask { (privateContext) in
// Do changes
}
Однако эти изменения не объединяются в дочерний контекст.Как я могу это сделать?Моя идея была примерно такой:
let newChild = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
newChild.parent = context.parent
// As I understand it, perform() will run on a background queue in this case, right?
newChild.perform {
// Example modification:
// let object = newChild.object(with: civilization.objectID)
// newChild.delete(object)
try? newChild.save()
newChild.parent?.perform {
try? newChild.parent?.save()
}
}
Кажется, это работает, но имеет ли это какие-либо побочные эффекты или недостатки?И действительно ли он работает в фоновой очереди?
(я читал статью на NSManagedObjectContext
и узнал некоторые вещи, но мне все еще не ясно: https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext)
Спасибо!