Основные данные migratePersistentStore cra sh с execute / executeAndWait - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь использовать NSPersistentStoreCoordinator.migratePersistentStore(_:to:options:withType:) для перемещения постоянного магазина из одного места в другое, используя подход, подобный этому . (Моя общая цель - создать резервную копию, поэтому я также рисую здесь работу Оле Бегемана , которая, в свою очередь, вдохновлена ​​ предыдущим постом SO , но проблема в том, Встреча одинакова в обоих случаях.)

let sourceStore = ... // NSPersistentStore
let backupFileURL = ... // URL
try self.migratePersistentStore(sourceStore, to: backupFileURL, options: [:], withType: NSSQLiteStoreType)

При вызове migratePersistentStore Core Data загружает объекты в память, вызывая вызов на awakeFromFetch() для каждого из них. При этом используется некоторая память, что неудивительно, но не обязательно имеет большое значение в этом случае.

Однако, если awakeFromFetch() происходит что-то, что использует NSManagedObjectContext.perform или NSManagedObjectContext.performAndWait, приложение падает при перемещении постоянное хранилище с такой ошибкой:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.'

Насколько я могу судить, cra sh происходит потому, что во время перемещения / миграции вызывается awakeFromFetch() в NSManagedObjectContext, который использует устаревший confinementConcurrencyType и вызовы execute / executeAndWait не разрешены для этого типа параллелизма.

(Вот очень простой пример awakeFromFetch(), который я использую в качестве демонстрации:)

public override func awakeFromFetch() {
    super.awakeFromFetch()
    managedObjectContext?.perform {
        print("Hello, world!")
    }
}

Теоретически я мог бы обойти эту проблему, проверив тип параллелизма контекста и только обернуть вызовы в execute / executeAndWait, если это не контекст ограничения, но это кажется громоздким и не соответствующим лучшим рекомендациям.

У кого-нибудь есть рекомендации, как с этим справиться? Есть ли способ предложить migratePersistentStore использовать другой тип параллелизма?

...