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

Gob*_*bot 12 iphone nsmanagedobjectcontext ios

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

NSConfinementConcurrencyType

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

NSPrivateQueueConcurrencyType

每个MOC树(父级和子级MOC)共享相同的队列,无论每个都在哪个线程上.因此,每当发送来自任何这些上下文的保存消息时,它都被放入专门为此MOC树制作的私有提示中.

NSMainQueueConcurrencyType

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

mid*_*s06 6

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

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

[context performBlock:^{
    dataObject.title = @"Title";
    [context save:nil]; // Do actual error handling here
}];
Run Code Online (Sandbox Code Playgroud)

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

主队列类型只是在UIThread上执行所有操作.当你需要执行诸如绑定NSFetchedResultsController之类的操作或者需要与处理该上下文对象交织的任何其他ui相关任务时,这是必要的.

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