方法
performBlock:
和
performBlockAndWait:
用于向您的
NSManagedObjectContext
实例发送消息,如果MOC使用
NSPrivateQueueConcurrencyType
或
NSMainQueueConcurrencyType
进行初始化,则需要在块中执行任何与这些上下文类型相关的操作,例如设置持久存储或保存更改。
performBlock:
将块添加到后备队列并安排在其自己的线程上运行。该块将立即返回。您可能会将其用于长时间的持久化操作。
performBlockAndWait:
也会将块添加到后备队列并安排在其自己的线程上运行。但是,该块将一直等待,直到块执行完成为止。如果您需要知道操作是否成功才能继续进行,则可以选择此选项。
例如:
__block NSError *error = nil;
[context performBlockAndWait:^{
myManagedData.field = @"Hello";
[context save:&error];
}];
if (error) {
}
请注意,因为我使用了
performBlockAndWait:
,所以我可以在块外访问错误。使用
performBlock:
需要不同的方法。
来自
iOS 5核心数据发布说明:
NSManagedObjectContext现在提供了结构化的并发操作支持。使用initWithConcurrencyType:创建托管对象上下文时,您有三个选项可用于其线程(队列)关联:
- 限制型(NSConfinementConcurrencyType)。
这是默认值。您保证上下文不会被除创建它的线程之外的任何线程使用。(这与之前发布版本中使用的完全相同的线程要求相同。)
- 私有队列(NSPrivateQueueConcurrencyType)。
上下文创建和管理一个私有队列。上下文拥有队列并为您管理所有细节(前提是您使用如下所述的基于块的方法)。
- 主队列(NSMainQueueConcurrencyType)。
上下文与主队列相关联,并因此与应用程序的事件循环联系在一起,但否则类似于基于私有队列的上下文。您使用此队列类型来链接到控制器和UI对象的上下文,这些对象仅需要在主线程上使用。