什么是NSManagedObjectContext的performBlock:用于?

在iOS 5中, NSManagedObjectContext有一些新的方法, performBlock:performBlockAndWait: 这些方法实际使用的是什么? 他们在旧版本中取代什么? 应该传递什么样的信息给他们? 我如何决定使用哪个? 如果有人使用它的一些例子,那就太好了。

如果使用NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType初始化MOC,则使用performBlock:performBlockAndWait:方法将消息发送到您的NSManagedObjectContext实例。 如果您对这些上下文types之一进行了任何操作,例如设置持久性存储或保存更改,则可以在块中执行此操作。

performBlock:将该块添加到后备队列,并安排它在自己的线程上运行。 该块将立即返回。 您可能会将这种长时间持续操作用于后备存储。

performBlockAndWait:还会将该块添加到备份队列中,并计划它在自己的线程上运行。 但是,块将不会返回,直到块完成执行。 如果直到你知道手术是否成功,你才能继续前进,那么这是你的select。

例如:

 __block NSError *error = nil; [context performBlockAndWait:^{ myManagedData.field = @"Hello"; [context save:&error]; }]; if (error) { // handle the error. } 

请注意,因为我执行了一个performBlockAndWait:所以我可以访问该块之外的错误。 performBlock:将需要不同的方法。

从iOS 5核心数据发布说明 :

NSManagedObjectContext现在为并发操作提供了结构化的支持。 使用initWithConcurrencyType:创build托pipe对象上下文时,您有三个选项用于其线程(队列)关联

  • 限制(NSConfinementConcurrencyType)。

    这是默认的。 您保证上下文将不会被您创build它的任何线程使用。 (这与以前版本中使用的线程要求完全相同。)

  • 专用队列(NSPrivateQueueConcurrencyType)。

    上下文创build并pipe理专用队列。 而不是创build和pipe理与上下文关联的线程或队列,这里上下文拥有队列并为您pipe理所有的细节(假定您使用如下所述的基于块的方法)。

  • 主队列(NSMainQueueConcurrencyType)。

    上下文与主队列相关联,因此被绑定到应用程序的事件循环中,但在其他方面类似于基于私有队列的上下文。 您使用此队列types链接到控制器和仅在主线程上使用的UI对象的上下文。

它们允许您访问相同的managedObjectContext跨线程。

我不太确定我是否正确,但这是我如何使用它。

您使用performBlockAndWait就像“平常”。 如果仅在一个线程上执行managedObjectContext,则不需要它。 如果你在很multithreading上执行它,那么你会需要performBlock

所以,如果你在主线程上,你不需要为主要的managedObjectContextperformBlockAndWait 。 至less我不这样做,并且做得很好。

但是,如果你在其他线程上访问managedObjectContext ,那么你需要执行performBlockAndWait

这就是performBlockperformBlockAndWait的目的。

有人请纠正我,如果我在这里错了。 当然,如果你只在一个线程上访问上下文,那么你可以简单地使用默认值。