在新的iOS5 NSManagedObjectContext中使用performBlockAndWait有什么意义?

时间:2012-10-05 07:29:01

标签: objective-c ios5 xcode4.3

我正在修改我的程序以使用新的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 ....那为什么要排队?

有人在乎解释吗?

2 个答案:

答案 0 :(得分:0)

执行块的线程可能与调用performBlockAndWait的线程不同。

例如,某些核心数据对象可能只能在主线程上执行。

因此,performBlockAndWait会在主线程(不同的线程)上执行它并阻塞当前线程。

也是它的救星。核心数据将适当地锁定事物以防止冲突。如果有多个线程访问相同的托管对象上下文,则需要将其拉出来。

答案 1 :(得分:0)

performBlockAndWait:的原因是它将获取并保持并发锁以访问Core Data。您可以将其视为lock / unlock方法的现代化,但这是未记录的实现细节。

如果您只是直接执行代码,它就不会进行正确的并发锁定。这有趣的原因有很多:

  1. 对核心数据的请求不能正确序列化。也就是说,如果你performBlock:(没有等待),代码最终可能会与其他核心数据代码同时执行,这可能会导致协调器或持久存储中出现问题。
  2. 它......好吧,我实际上并不认为应该工作。在大多数情况下,它似乎在实践中,但是您在没有必要的锁定的情况下运行Core Data 。非常确定你至少会在这里进行无证件行为。
  3. 所以:

    • performBlockAndWait:设置一个环境,您的块可以通过上下文访问Core Data并等待该块完成。
      • 文档没有说明该主题。它实际上没有记录为在当前线程上运行。
      • 即使它现在还没有,也可以在将来更改为至少某些情况下的辅助线程。
      • 再次阅读父母点:那就是你应该依赖的东西。其余的只是细节。
    • performBlock:设置了一个环境,您可以通过上下文阻止和访问Core Data,而不会等待该块完成。
      • 文档没有说明该主题。它实际上没有记录为在不同的线程上运行。
      • 虽然不太可能,但OS的未来版本可能会决定稍后在当前线程上运行该块。
      • 同样,父母的观点是你依赖的。其余的是无证件的细节。

    我希望有所帮助。基本上,当你接触这些电话时,你应该比你更笨。让操作系统做正确的事情,尽量不要假设它做了什么。 :)

    NSPrivateQueueConcurrencyType常数对其工作原理设置了太多期望。