目前有关新的NSManagedObjectContext并发类型的文献似乎有点稀疏。除了WWDC 2011 vids以及我在此过程中提到的其他一些信息之外,我仍然很难掌握每种并发类型的使用方式。以下是我如何解释每种类型。如果我理解错误,请纠正我。
这种类型在过去几年中一直是常态。 MOC被屏蔽了每个线程。因此,如果线程A MOC想要通过保存消息合并来自线程B MOC的数据,则线程A将需要订阅线程B的MOC保存通知。
每个MOC树(父级和子级MOC)共享相同的队列,无论每个都在哪个线程上。因此,只要发送来自任何这些上下文的保存消息,就会将其放入专门为此MOC树提供的私有提示中。
仍然对此感到困惑。根据我的收集,它就像NSPrivateQueueConcurrencyType一样,只有私有队列在主线程上运行。我读到这对于与MOC的UI通信是有益的,但为什么呢?为什么我会选择NSPrivateQueueConcurrencyType?我假设因为NSMainQueueConcurrencyType在主线程中执行,这是否允许后台进程?这不是不使用线程吗?
答案 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将后台线程上的子上下文放在主线程上。我错了吗?