Я пытаюсь использовать 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
использовать другой тип параллелизма?