iOS5 NSManagedObjectContext 并发类型以及它们是如何使用的?
Posted
技术标签:
【中文标题】iOS5 NSManagedObjectContext 并发类型以及它们是如何使用的?【英文标题】:iOS5 NSManagedObjectContext Concurrency types and how are they used? 【发布时间】:2012-03-11 18:37:57 【问题描述】:目前关于新的 NSManagedObjectContext 并发类型的文献似乎有点稀少。除了 WWDC 2011 视频和我在此过程中获得的一些其他信息之外,我仍然很难掌握每种并发类型的使用方式。以下是我如何解释每种类型。如果我理解不正确,请纠正我。
NSConfinementConcurrencyType
这种类型在过去几年中已成为常态。 MOC 不受每个线程的影响。所以如果线程 A MOC 想要通过保存消息合并来自线程 B MOC 的数据,线程 A 需要订阅线程 B 的 MOC 保存通知。
NSPrivateQueueConcurrencyType
每个 MOC 树(父 MOC 和子 MOC)共享同一个队列,无论它们在哪个线程上。因此,每当发送来自这些上下文中的任何一个的保存消息时,它都会被放入专门为此 MOC 树制作的私人提示中。
NSMainQueueConcurrencyType
仍然对这个感到困惑。据我所知,它类似于 NSPrivateQueueConcurrencyType,只有私有队列在 main 线程上运行。我读到这有利于与 MOC 的 UI 通信,但为什么呢?为什么我会选择这个而不是 NSPrivateQueueConcurrencyType?我假设由于 NSMainQueueConcurrencyType 在主线程中执行,这不允许后台进程吗?这和不使用线程不一样吗?
【问题讨论】:
【参考方案1】:队列并发类型帮助您管理多线程核心数据:
对于这两种类型,只有当您使用其中一种 performBlock 方法执行操作时,操作才会在正确的队列上发生。即
[context performBlock:^
dataObject.title = @"Title";
[context save:nil]; // Do actual error handling here
];
私有队列并发类型在后台线程中完成所有工作。非常适合处理或磁盘 io。
主队列类型只是在 UIThread 上执行所有操作。当您需要时,这是必要的 做一些事情,比如将 NSFetchedResultsController 绑定到它,或者任何其他需要与处理该上下文对象交织在一起的 ui 相关任务。
当你把它们结合起来时,真正的乐趣就来了。想象一下,有一个父上下文在作为私有队列上下文的后台线程上执行所有 io,然后您针对主队列类型的子上下文执行所有 ui 工作。这基本上就是 UIManagedDocument 所做的。它使您可以让您的 UI 队列免于管理数据所必须完成的繁重工作。
【讨论】:
【参考方案2】:我认为答案在注释中: Mac OS X Lion 的核心数据发行说明 http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html
对于NSPrivateQueueConcurrencyType,我觉得你说的不对。 使用此并发类型创建的子上下文将拥有自己的队列。 父/子上下文与线程并不完全相关。 父/子似乎简化了上下文之间的通信。 我知道您只需保存子上下文中的更改即可将它们带回父上下文中(我还没有测试过)。 通常父/子上下文模式与主队列/后台队列模式相关,但这不是强制性的。 [编辑] 对存储的访问(保存和加载)似乎是通过主上下文(在主队列中)完成的。因此,执行后台获取并不是一个好的解决方案,因为 executeFetchRequest 后面的查询将始终在主队列中执行。
NSMainQueueConcurrencyType 与 NSPrivateQueueConcurrencyType 相同,但由于与主队列有关,我了解您无需使用 performBlock 就可以使用上下文执行操作;如果您在主队列的上下文中,例如在视图控制器委托代码中 (viewDidLoad 等)。
【讨论】:
【参考方案3】:midas06 写道:
想象有一个在后台执行所有 io 的父上下文 线程是一个私有队列上下文,然后你做你所有的用户界面 针对主队列类型的子上下文工作。
我理解它是相反的:您使用 NSMainQueueConcurrencyType 将父上下文放在主线程上,使用 NSPrivateQueyeConcurrencyType 将子上下文放在后台线程上。我错了吗?
【讨论】:
以上是关于iOS5 NSManagedObjectContext 并发类型以及它们是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章
IOS5中的Safari不兼容Javascript中的Date问题