iOS5 NSManagedObjectContext并发类型以及它们是如何使用的?

时间:2012-03-11 18:37:58

标签: iphone ios nsmanagedobjectcontext

目前有关新的NSManagedObjectContext并发类型的文献似乎有点稀疏。除了WWDC 2011 vids以及我在此过程中提到的其他一些信息之外,我仍然很难掌握每种并发类型的使用方式。以下是我如何解释每种类型。如果我理解错误,请纠正我。

NSConfinementConcurrencyType

这种类型在过去几年中一直是常态。 MOC被屏蔽了每个线程。因此,如果线程A MOC想要通过保存消息合并来自线程B MOC的数据,则线程A将需要订阅线程B的MOC保存通知。

NSPrivateQueueConcurrencyType

每个MOC树(父级和子级MOC)共享相同的队列,无论每个都在哪个线程上。因此,只要发送来自任何这些上下文的保存消息,就会将其放入专门为此MOC树提供的私有提示中。

NSMainQueueConcurrencyType

仍然对此感到困惑。根据我的收集,它就像NSPrivateQueueConcurrencyType一样,只有私有队列在线程上运行。我读到这对于与MOC的UI通信是有益的,但为什么呢?为什么我会选择NSPrivateQueueConcurrencyType?我假设因为NSMainQueueConcurrencyType在主线程中执行,这是否允许后台进程?这不是不使用线程吗?

3 个答案:

答案 0 :(得分:6)

队列并发类型可帮助您管理多线程核心数据:

对于这两种类型,只有在使用其中一种performBlock方法执行操作时,才会在正确的队列上执行操作。即。

[context performBlock:^{
    dataObject.title = @"Title";
    [context save:nil]; // Do actual error handling here
}];

私有队列并发类型在后台线程中完成所有工作。非常适合处理或磁盘io。

主队列类型只是在UIThread上执行所有操作。这是你需要的时候的必要条件  做一些事情,比如将NSFetchedResultsController绑定到它,或者任何其他需要与处理上下文对象交织的ui相关任务。

当你将它们组合起来时真正的乐趣。想象一下,有一个父上下文在一个私有队列上下文的后台线程上执行所有操作,然后您可以针对主队列类型的子上下文执行所有ui工作。这基本上是UIManagedDocument所做的。它可以让您保持UI队列免于必须完成的繁忙工作来管理数据。

答案 1 :(得分:2)

我认为答案在说明中: 适用于Mac OS X Lion的核心数据发行说明 http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html

对于 NSPrivateQueueConcurrencyType ,我认为你不对。 使用此并发类型创建的子上下文将具有自己的队列。 父/子上下文与线程不完全相关。 父/子似乎简化了上下文之间的通信。 我知道您只需要保存子上下文中的更改以将它们带回父上下文(我还没有测试过它)。 通常,父/子上下文模式与主队列/后台队列模式相关,但它不是必需的。 [编辑]似乎访问商店(保存和加载)是通过主上下文(在主队列中)完成的。因此,执行后台提取不是一个好的解决方案,因为executeFetchRequest背后的查询将始终在主队列中执行。

对于 NSMainQueueConcurrencyType ,它与 NSPrivateQueueConcurrencyType 相同,但由于它与主队列相关,我理解您使用上下文执行操作,而不必使用performBlock;如果您在主队列的上下文中,则在View控制器委托代码中 (viewDidLoad等)。

答案 2 :(得分:1)

midas06写道:

  

想象一下,父背景可以在背景上完成所有操作   线程是一个私有队列上下文,然后你做你所有的ui   针对主队列类型的子上下文工作。

我理解它是另一种方式:使用NSMainQueueConcurrencyType将父上下文放在主线程上,并使用NSPrivateQueyeConcurrencyType将后台线程上的子上下文放在主线程上。我错了吗?

相关问题