NSManagedObjectContext的performBlock中的dispatch_async

时间:2012-11-20 07:49:02

标签: ios core-data grand-central-dispatch

根据WWDC 2012视频“核心数据最佳实践”,dispatch_sync应该用于在performBlock上下文中运行某种回调,该回调是作为{{1的类型创建的}}

为什么?

我可以使用NSPrivateQueueConcurrencyType ...在私人队列的上下文dispatch_async(dispatch_get_main_queue(), 0)中调用一些与UI相关的回调吗?

2 个答案:

答案 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

    });
}];