什么是NSManagedObjectContext的performBlock:用于?

时间:2012-03-29 08:59:30

标签: ios core-data ios5 nsmanagedobjectcontext blocking

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

2 个答案:

答案 0 :(得分:124)

如果使用performBlock:performBlockAndWait:初始化MOC,则NSManagedObjectContextNSPrivateQueueConcurrencyType方法用于向您的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

这就是performBlockperformBlockAndWait的目的。

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