根据 WWDC 2012 视频,“Core Data Best Practices”,dispatch_sync
应该用于在上下文中运行某种回调performBlock
,它被创建为NSPrivateQueueConcurrencyType
.
这是为什么?
我可以使用dispatch_async(dispatch_get_main_queue(), 0)
... 在私有队列的上下文中调用一些与 UI 相关的回调performBlock
吗?
根据 WWDC 2012 视频,“Core Data Best Practices”,dispatch_sync
应该用于在上下文中运行某种回调performBlock
,它被创建为NSPrivateQueueConcurrencyType
.
这是为什么?
我可以使用dispatch_async(dispatch_get_main_queue(), 0)
... 在私有队列的上下文中调用一些与 UI 相关的回调performBlock
吗?
不。 NSPrivateQueueConcurrencyType
管理它自己的内部队列,并且不喜欢你试图让其中一个线程去做你想做的事情(事实上,我相信当这种行为发生时它会抛出异常)。有几种方法可以处理这个问题,当然信号量是更可接受的设计模式以获得真正的“异步感觉”,但正如您所注意到的,dispatch_sync
通常是要走的路。
谷歌把我带到了这里,所以如果有人像我一样对这些东西不熟悉,并且会从代码示例中受益,这里有一个:
__block dispatch_queue_t currentQ = dispatch_get_current_queue();
[managedObjectContext performBlock:^{
//do the stuff you need to do in a background thread
dispatch_sync(currentQ, ^(){
//callback code for once the background stuff is complete
});
}];