NSManagedObjectContext的performBlock中的dispatch_async

根据WWDC 2012video“核心数据最佳实践”, dispatch_sync应该用于在performBlock上下文中运行某种回调,它是作为一种NSPrivateQueueConcurrencyType创建的。

这是为什么?

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

NSPrivateQueueConcurrencyType管理它自己的内部队列,并且不喜欢你试图让它的一个线程做你想做的事情(实际上,我相信它会在发生这种行为时抛出exception)。 有几种方法可以解决这个问题,当然信号信号量是获得真正“异步感”的更可接受的设计模式,但正如您所注意到的, dispatch_sync通常是要走的路。

Google让我来到这里,所以如果有人像我一样对这些东西不熟悉,并且会从代码示例中受益,那么这里有一个:

 __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 }); }];