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