0

У меня есть часть кода, где я вызываю migratePersistentStore, и я хочу, чтобы предотвратить любые temporaryContext, чтобы что-либо сделать за одно и то же время, как?Как предотвратить одновременный запуск временного конфликта с migratePersistentStore

Моя идея основана на semaphore и dispatch_group.

код A:

dispatch_group_wait(dgLoadMain, DISPATCH_TIME_FOREVER) 
dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) 

mainMOC!.performBlockAndWait({ 

    mainMOC!.persistentStoreCoordinator!.migratePersistentStore(/* ... */) 
}) 

dispatch_semaphore_signal(semaLoadMain) 

код B:

dispatch_group_enter(dgLoadMain) 
dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) 
dispatch_semaphore_signal(semaLoadMain) 
let context = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
context.parentContext = mainMOC 

var context: NSManagedObjectContext 
context.performBlockAndWait({ 

    // .. some code I do not want to run when migrating persistent store 

    context.save(nil) 
}) 

mainMOC.performBlockAndWait({ 

    mainMOC.save(nil) 
}) 

dispatch_group_leave(dgLoadMain) 

Что вы думаете об этом? Любое решение bette? Можно ли использовать в этом случае dispatch_barrier_async?

ответ

2

Лучшим решением является разработка приложения, чтобы это не было необходимо. Фактически вы блокируете все приложение (включая поток пользовательского интерфейса) от каких-либо действий во время миграции.

Лучше разработать это как механизм состояния, выполнить миграцию в фоновом режиме и затем уведомить пользовательский интерфейс, когда миграция будет завершена. Таким образом, ваше приложение реагирует на систему (и вы не будете убиты операционной системой), а также может предоставлять пользователю потенциальные обновления статуса.

Что вы здесь делаете, просто попрошайничество для ОС, чтобы убить ваше приложение в середине миграции.