什么是NSManagedObjectContext的performBlock:用于?

nev*_*ing 67 core-data blocking nsmanagedobjectcontext ios ios5

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

Mik*_*keG 124

这些方法performBlock:performBlockAndWait:用于发送邮件到您NSManagedObjectContext,如果MOC使用初始化实例NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType.如果您对这些上下文类型之一执行任何操作(例如设置持久性存储或保存更改),则可以在块中执行此操作.

performBlock:将块添加到后备队列并将其安排在自己的线程上运行.该块将立即返回.您可以将此用于对后备存储的长时间持久操作.

performBlockAndWait:还会将块添加到后备队列并将其安排在自己的线程上运行.但是,块将在块执行完毕后才会返回.如果您不知道操作是否成功,那么这是您的选择.

例如:

__block NSError *error = nil;
[context performBlockAndWait:^{
    myManagedData.field = @"Hello";
    [context save:&error];
}];

if (error) {
    // handle the error.
}
Run Code Online (Sandbox Code Playgroud)

请注意,因为我做了performBlockAndWait:,我可以访问块外的错误.performBlock:需要采用不同的方法.

iOS 5核心数据发布说明:

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

  • 限制(NSConfinementConcurrencyType).

    这是默认值.您保证除了您创建它之外的任何线程都不会使用上下文.(这与您在以前的版本中使用的线程要求完全相同.)

  • 专用队列(NSPrivateQueueConcurrencyType).

    上下文创建并管理专用队列.您不是创建和管理与上下文关联的线程或队列,而是拥有队列并管理您的所有详细信息(前提是您使用如下所述的基于块的方法).

  • 主队列(NSMainQueueConcurrencyType).

    上下文与主队列相关联,因此与应用程序的事件循环相关联,但它在其他方面类似于基于私有队列的上下文.您可以将此队列类型用于链接到控制器的上下文和仅需要在主线程上使用的UI对象.

  • @MikeG我觉得你可能有些事情发生逆转(或者我在阅读这篇文章时反过来).performBlockAndWait将阻止从* - main或其他方面调用*的任何线程,并且不关心MOC与哪个线程相关联.还是我误读了你? (2认同)