我有一个代码部分,我在其中调用migratePersistentStore
,并且想防止任何temporaryContext
同时执行任何操作,怎么办?
我的想法是基于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)
你怎么看待这件事?任何解决方案?在这种情况下可以使用
dispatch_barrier_async
吗? 最佳答案
更好的解决方案是设计应用程序,这样就不必要了。您正在有效地阻止整个应用程序(包括UI线程)在进行迁移时执行任何操作。
最好将其开发为状态引擎,在后台进行迁移,然后在迁移完成时通知UI。这样,您的应用程序就可以对系统做出响应(并且不会被操作系统杀死),并且还可以向用户提供潜在的状态更新。
您在这里所做的只是请求操作系统在迁移过程中终止您的应用程序。
关于ios - 如何防止temporaryContext与migratePersistentStore同时运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31232431/