根据WWDC 2012视频“核心数据最佳实践”,dispatch_sync
应该用于在performBlock
上下文中运行某种回调,该回调是作为{{1的类型创建的}}
为什么?
我可以使用NSPrivateQueueConcurrencyType
...在私人队列的上下文dispatch_async(dispatch_get_main_queue(), 0)
中调用一些与UI相关的回调吗?
答案 0 :(得分:4)
没有。 NSPrivateQueueConcurrencyType
管理它自己的内部队列,并且不喜欢你试图让它的一个线程做你想做的事情(事实上,我相信它会在发生这种行为时抛出异常)。有几种方法可以解决这个问题,当然信号信号量是获得真正“异步感觉”的更可接受的设计模式,但正如你所指出的,dispatch_sync
通常是要走的路。
答案 1 :(得分:0)
__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
});
}];