我正在修改我的程序以使用新的iOS5风格。
所以我只是使用这段代码:
NSManagedObjectContext *threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
threadContext.parentContext = [self managedObjectContextMainThread];
//threadContext.persistentStoreCoordinator= [self persistentStoreCoordinator]; //moc.persistentStoreCoordinator;// [moc persistentStoreCoordinator];
我的新背景ManagedObjectContext没有persistentStore,而是有父存储。\
之后我想我应该添加
对我使用所有使用新MOC的操作的所有操作执行BlockAndWait。
至少到目前为止,我没有使用它并做得很好
performBlockAndWait是通过在相同的线程执行块来完成的,并等到它已完成。
它之间有什么区别,只需像往常一样输入代码?
我的意思是必须有一些使用,但我在这里完全失踪。
我能理解performBlock。这就像在后台执行某些事情一样。即使这样,它也被Global Central Dyspatch所取代。
是的,有一个名为Queue的新东西。好的,如果我们在相同的线程上做某事,当然一切都是连续完成的。 Duh ....那为什么要排队?
有人在乎解释吗?
答案 0 :(得分:0)
执行块的线程可能与调用performBlockAndWait的线程不同。
例如,某些核心数据对象可能只能在主线程上执行。
因此,performBlockAndWait会在主线程(不同的线程)上执行它并阻塞当前线程。
也是它的救星。核心数据将适当地锁定事物以防止冲突。如果有多个线程访问相同的托管对象上下文,则需要将其拉出来。
答案 1 :(得分:0)
performBlockAndWait:
的原因是它将获取并保持并发锁以访问Core Data。您可以将其视为lock
/ unlock
方法的现代化,但这是未记录的实现细节。
如果您只是直接执行代码,它就不会进行正确的并发锁定。这有趣的原因有很多:
performBlock:
(没有等待),代码最终可能会与其他核心数据代码同时执行,这可能会导致协调器或持久存储中出现问题。所以:
performBlockAndWait:
设置一个环境,您的块可以通过上下文访问Core Data并等待该块完成。
performBlock:
设置了一个环境,您可以通过上下文阻止和访问Core Data,而不会等待该块完成。
我希望有所帮助。基本上,当你接触这些电话时,你应该比你更笨。让操作系统做正确的事情,尽量不要假设它做了什么。 :)
NSPrivateQueueConcurrencyType
常数对其工作原理设置了太多期望。