Ваша инициализация контекста, а именно:
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()
.