Как предотвратить одновременный запуск временного контекста с migratePersistentStore

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

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

код А:

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)

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

1 ответ

Решение

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

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

Здесь вы просто просите ОС убить ваше приложение в процессе миграции.

Другие вопросы по тегам