什么是NSManagedObjectContext的performBlock:用于?
在iOS 5中, NSManagedObjectContext
有一些新的方法, performBlock:
和performBlockAndWait:
这些方法实际使用的是什么? 他们在旧版本中取代什么? 应该传递什么样的信息给他们? 我如何决定使用哪个? 如果有人使用它的一些例子,那就太好了。
如果使用NSPrivateQueueConcurrencyType
或NSMainQueueConcurrencyType
初始化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
。
所以,如果你在主线程上,你不需要为主要的managedObjectContext
做performBlockAndWait
。 至less我不这样做,并且做得很好。
但是,如果你在其他线程上访问managedObjectContext
,那么你需要执行performBlockAndWait
。
这就是performBlock
和performBlockAndWait
的目的。
有人请纠正我,如果我在这里错了。 当然,如果你只在一个线程上访问上下文,那么你可以简单地使用默认值。