【发布时间】:2011-06-15 14:42:22
【问题描述】:
似乎在 11 月,Apple 更新了 NSManagedObjectContext Class Reference 和 Core Data Programming Guide 文档,以明确祝福串行 GCD 调度队列和 NSOperationQueues 作为同步访问 NSManagedObjectContext 的可接受机制。但他们的建议似乎模棱两可,甚至可能自相矛盾,我想确保自己理解正确。
以前公认的观点似乎是 NSManagedObjectContext 只能从创建它的线程访问,并且使用串行队列进行同步是不够的;虽然串行队列一次只执行一项操作,但这些操作可能会被安排在不同的线程上,而 MOC 不喜欢这样。
但是现在,根据编程指南,我们有:
您可以使用线程、串行操作队列或调度队列来实现并发。为简洁起见,本文始终使用“线程”来指代其中的任何一个。
到目前为止,一切都很好(尽管它们将线程和队列混为一谈没有帮助)。所以我可以安全地为每个(串行)队列使用一个上下文,而不是每个操作/块一个,对吧? Apple 甚至在 Core Data WWDC 会议中对此进行了可视化描述。
但是...您在哪里为队列创建上下文?在NSManagedObjectContext 文档中,Apple 声明:
[A context] 假定默认所有者是分配它的线程或队列——这由调用其 init 方法的线程决定。因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程。
所以现在我们有了NSManagedObjectContext 需要知道它的所有者是谁的想法。我假设这意味着队列中要执行的第一个操作应该创建 MOC 并保存对它的引用以供其余操作使用。
这是对的吗?我犹豫的唯一原因是NSManagedObjectContext 文章继续说:
相反,您应该将引用传递给持久存储协调器,并让接收线程/队列创建一个从中派生的新上下文。如果使用 NSOperation,则必须在 main(对于串行队列)或 start(对于并发队列)中创建上下文。
Apple 现在似乎将操作与安排其执行的队列混为一谈。这让我很头疼,让我想知道他们是否真的希望你为每个操作创建一个新的 MOC。我错过了什么?
【问题讨论】:
标签: objective-c multithreading cocoa core-data