相关疑难解决方法(0)

当Apple说NSManagedObjectContext由创建它的线程或队列拥有时,它意味着什么?

似乎在11月,Apple更新了NSManagedObjectContext类参考核心数据编程指南文档,明确地将串行GCD调度队列和NSOperationQueues作为可接受的机制来同步访问NSManagedObjectContext.但他们的建议似乎含糊不清,可能相互矛盾,我想确保我已经理解它.

以前,公认的智慧似乎NSManagedObjectContext只能从创建它的线程访问,并且使用串行队列进行同步是不够的; 虽然串行队列一次只执行一个操作,但这些操作可能会在不同的线程上进行调度,而MOC不喜欢这样.

但是现在,从编程指南,我们有:

您可以使用线程,串行操作队列或调度队列进行并发.为了简明起见,本文始终使用"线程"来指代其中任何一个.

到目前为止,这么好(尽管他们对线程和队列的混淆是无益的).所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对吧?Apple甚至在Core Data WWDC会话中对此进行了直观描述.

但是......你在哪里为队列创建上下文?在NSManagedObjectContext文档中,Apple声明:

[上下文]假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.

所以现在我们有了一个NSManagedObjectContext需要知道它的主人是谁的想法.我假设这意味着要在队列中执行的第一个操作应该创建MOC并保存对它的引用以供剩余的操作使用.

这是正确的吗?我犹豫不决的唯一原因是NSManagedObjectContext文章继续说:

相反,您应该传递对持久性存储协调器的引用,并让接收线程/队列创建从该派生协调器派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.

Apple现在似乎将操作与安排执行的队列混为一谈.这是我的头脑,并让我想知道他们是否真的希望你只为每个操作创建一个新的MOC.我错过了什么?

cocoa multithreading core-data objective-c

61
推荐指数
2
解决办法
7364
查看次数

标签 统计

cocoa ×1

core-data ×1

multithreading ×1

objective-c ×1