在iOS 5中,NSManagedObjectContext
有几种新方法,performBlock:
和performBlockAndWait:
。实际使用的这些方法是什么?它们在旧版本中取代了什么?什么样的街区应该传递给他们?我该如何决定使用哪个?如果有人有一些使用它们的例子,那就太好了。
答案 0 :(得分:124)
如果使用performBlock:
或performBlockAndWait:
初始化MOC,则NSManagedObjectContext
和NSPrivateQueueConcurrencyType
方法用于向您的NSMainQueueConcurrencyType
实例发送消息。如果您对这些上下文类型之一执行任何操作,例如设置持久存储或保存更改,则可以在块中执行此操作。
performBlock:
会将块添加到后备队列并将其安排在自己的线程上运行。该块将立即返回。您可以将其用于对后备存储的长时间持久操作。
performBlockAndWait:
还会将块添加到后备队列,并将其安排在自己的线程上运行。但是,块将在块执行完毕后才会返回。如果你不知道操作是否成功,那么这是你的选择。
例如:
__block NSError *error = nil;
[context performBlockAndWait:^{
myManagedData.field = @"Hello";
[context save:&error];
}];
if (error) {
// handle the error.
}
请注意,因为我做了performBlockAndWait:
,我可以访问块外的错误。 performBlock:
需要采用不同的方法。
来自iOS 5 core data release notes:
NSManagedObjectContext现在为并发操作提供结构化支持。使用initWithConcurrencyType:创建托管对象上下文时,您的线程(队列)关联有三个选项
限制(NSConfinementConcurrencyType)。
这是默认值。您保证除了您创建它之外的任何线程都不会使用上下文。 (这与您在先前版本中使用的线程要求完全相同。)
专用队列(NSPrivateQueueConcurrencyType)。
上下文创建并管理专用队列。您不是创建和管理与上下文关联的线程或队列,而是拥有队列并为您管理所有详细信息(前提是您使用如下所述的基于块的方法)。
< / LI>主队列(NSMainQueueConcurrencyType)。
上下文与主队列相关联,因此与应用程序的事件循环相关联,但它在其他方面类似于基于私有队列的上下文。您可以将此队列类型用于链接到控制器和UI对象的上下文,这些对象只需要在主线程上使用。
答案 1 :(得分:-3)
它们允许您访问相同的managedObjectContext
交叉线程。
我不确定我是否正确,但这就是我使用它的方式。
您使用performBlockAndWait
就像“通常”一样。如果仅在一个线程上执行managedObjectContext,则不需要它。如果你在很多线程上执行它,那么是的,你将需要performBlock
。
因此,如果您使用主线程,则不需要为主performBlockAndWait
执行managedObjectContext
。至少我没有,并且做得很好。
但是,如果您在其他线程上访问managedObjectContext
,那么您需要执行performBlockAndWait
。
这就是performBlock
和performBlockAndWait
的目的。
如果我在这里错了,请有人纠正我。当然,如果您只在一个线程上访问上下文,那么您只需使用默认值。