目前,关于新的NSManagedObjectContext并发类型的文献似乎有点少。除了WWDC 2011的vids和一些其他的信息,我还很难理解每种并发类型是如何使用的。下面是我如何解释每一种类型。如果我不正确地理解什么,请纠正我。
NSConfinementConcurrencyType
在过去的几年里,这种类型已经成为常态。MOC被屏蔽,不受每条线的影响。因此,如果线程A MOC希望通过保存消息合并来自线程B MOC的数据,线程A将需要订阅线程B的MOC保存通知。
NSPrivateQueueConcurrencyType
每个MOC树(父和子MOCs)共享相同的队列,不管每个线程都是在哪个线程上。因此,每当发送来自这些上下文的保存消息时,都会将其放入专用提示中,只针对此MOC树。
NSMainQueueConcurrencyType
还是被这个弄糊涂了。据我所知,它类似于NSPrivateQueueConcurrencyType,只有私有队列在主线程上运行。我读到,这对与MOC的UI通信是有益的,但为什么呢?为什么我要选择这个而不是NSPrivateQueueConcurrencyType呢?我假设NSMainQueueConcurrencyType是在主线程中执行的,这不允许后台进程吗?这不等于不使用线程吗?
发布于 2012-03-15 20:56:55
队列并发类型帮助您管理多读的核心数据:
对于这两种类型,只有在使用performBlock方法之一执行正确的队列时,操作才会发生。即
[context performBlock:^{
dataObject.title = @"Title";
[context save:nil]; // Do actual error handling here
}];私有队列并发类型在后台线程中执行它的所有工作。很适合处理或磁盘io。
主队列类型只执行它在UIThread上的所有操作。当您需要将一个NSFetchedResultsController绑定到它,或者任何其他与ui相关的任务需要与处理该上下文的对象交织在一起时,这是非常必要的。
真正的乐趣是当你把它们结合起来的时候。假设有一个父上下文在后台线程(即私有队列上下文)上执行所有io,然后针对主队列类型的子上下文执行所有ui工作。这基本上是UIManagedDocument所做的。它允许您保持UI队列不受管理数据所必须做的工作的影响。
发布于 2012-03-30 09:01:42
我认为答案在注释中: Mac http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html的核心数据发布说明
对NSPrivateQueueConcurrencyType,来说,我认为你是不对的。使用此并发类型创建的子上下文将具有自己的队列。父/子上下文并不完全与线程相关。父/子似乎简化了上下文之间的通信。我知道,您只需保存子上下文中的更改,就可以将它们带回父上下文(我还没有对其进行测试)。通常父/子上下文模式与主队列/后台队列模式相关,但不是强制性的。对存储的访问(保存和加载)似乎是通过主上下文(在主队列中)完成的。因此,执行后台获取并不是一个好的解决方案,因为executeFetchRequest后面的查询将始终在主队列中执行。
对于NSMainQueueConcurrencyType,,它与NSPrivateQueueConcurrencyType,相同,但由于它与主队列相关,我理解您使用performBlock执行上下文操作,而不必使用performBlock;如果您位于主队列的上下文中,例如在视图控制器委托代码(viewDidLoad等)中。
发布于 2012-04-06 22:50:31
midas06写道:
假设有一个父上下文在后台线程(即私有队列上下文)上执行所有io,然后针对主队列类型的子上下文执行所有ui工作。
我的理解是相反的:使用NSMainQueueConcurrencyType将父上下文放在主线程上,使用NSPrivateQueyeConcurrencyType将子上下文放在后台线程上。我说错了吗?
https://stackoverflow.com/questions/9657760
复制相似问题