Как правильно вносить изменения в родительский NSManagedObjectContext, которые объединяются в дочерний контекст? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть вопрос об обработке родительского и дочернего элементов 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)

Спасибо!

...