如何防止 temporaryContext 运行 与 migratePersistentStore 同时发生
How to prevent temporaryContext run concurrently with migratePersistentStore
我有一个调用 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。这样您的应用程序就会响应系统(并且您不会被 OS 杀死)并且还可以向用户提供潜在的状态更新。
您在这里所做的只是乞求 OS 在迁移过程中终止您的应用程序。
我有一个调用 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。这样您的应用程序就会响应系统(并且您不会被 OS 杀死)并且还可以向用户提供潜在的状态更新。
您在这里所做的只是乞求 OS 在迁移过程中终止您的应用程序。