如何防止temporaryContext与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)
你怎么看待这件事? 任何bette解决scheme? 在这种情况下可以使用dispatch_barrier_async
吗?
一个更好的解决scheme是devise应用程序,这是没有必要的。 您正在有效地阻止整个应用程序(包括UI线程)在进行迁移时执行任何操作。
最好将其作为状态引擎进行开发,在后台进行迁移,然后在迁移完成时通知UI。 这样你的应用程序就可以对系统做出响应(你不会被操作系统杀死),也可以为用户提供潜在的状态更新。
你在这里做的只是乞求操作系统杀死你的应用程序中期移民。