CoreData: разница между backgroundContext и дочерним контекстом с privateQueueConcurrencyType? - PullRequest
0 голосов
/ 04 октября 2019

С CoreData вы можете попросить контейнер создать фоновый контекст с container.newBackgroundContext().

Это полезно для использования основных данных в фоновом режиме без влияния на основной контекст пользовательского интерфейса.

Вытакже можно создать дочерний контекст с privateQueueConcurrencyType

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

. В этом случае, если я не ошибаюсь, контекст все равно будет выполняться в фоновом режиме в другой очереди.

Так что жеразница между двумя и когда использовать один и другой?

1 Ответ

0 голосов
/ 04 октября 2019

Ваша инициализация контекста, а именно:

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

, обычно использовалась до введения NSPersistentContainer . См. Также https://developer.apple.com/documentation/coredata/using_core_data_in_the_background,, где указано:

Инициализация и настройка контекстов Для обоих контекстов инициализация экземпляра NSManagedObjectContext одинакова: let moc = NSManagedObjectContext (concurrencyType: <# type #>) Параметр, передаваемый как часть инициализации, определяет, какой тип NSManagedObjectContext возвращается. Когда вы используете NSPersistentContainer, вы конфигурируете свойство viewContext в качестве главной очереди (NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType) и настраиваете контексты, связанные с executeBackgroundTask (_ :) и newBackgroundContext (). privateQueueConcurrencyType).

В документации newBackgroundContext () говорится следующее:

Вызов этого метода приводит к тому, что постоянный контейнер создает и возвращает новыйNSManagedObjectContext с параметром concurrencyType, установленным в NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType. Этот новый контекст будет напрямую связан с NSPersistentStoreCoordinator и настроен на автоматическое использование рассылок NSManagedObjectContextDidSave.

newBackgroundContext() делает то же, что и предоставленный вами код, и что-то еще, что явыделил в приведенной выше цитате.

При разработке для iOS 10+, я бы порекомендовал использовать NSPersistentContainer и newBackgroundContext(), если вы хотите заблокировать вызывающий поток, или performBackgroundTask, если вы не хотитек вызову потока для блокировки, когда вы хотите отправить работу в фоновый режим.

Я не работал с CoreData до iOS 10, но я думаю, что вам нужно сделать больше вещей, чтобы контекст работал при его инициализации простос concurrenyType. Это больше не нужно с newBackgroundContext().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...