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,只有私有队列在 ma​​in 线程上运行。我读到这有利于与 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 后面的查询将始终在主队列中执行。

NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType 相同,但由于与主队列有关,我了解您无需使用 performBlock 就可以使用上下文执行操作;如果您在主队列的上下文中,例如在视图控制器委托代码中 (viewDidLoad 等)。

【讨论】:

【参考方案3】:

midas06 写道:

想象有一个在后台执行所有 io 的父上下文 线程是一个私有队列上下文,然后你做你所有的用户界面 针对主队列类型的子上下文工作。

我理解它是相反的:您使用 NSMainQueueConcurrencyType 将父上下文放在主线程上,使用 NSPrivateQueyeConcurrencyType 将子上下文放在后台线程上。我错了吗?

【讨论】:

以上是关于iOS5 NSManagedObjectContext 并发类型以及它们是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章

IOS5中的Safari不兼容Javascript中的Date问题

ios5:停止视图被卸载/停止 viewDidUnload 被调用

iOS5 中的图像移动和缩放问题

iOS5 应用未在通知中心列出

iOS5 区域监控准确率

当我们在 ios5.1、ios6 等其他操作系统版本中拥有应用程序时,如何在 ios5 模拟器中启动应用程序?