似乎在11月,苹果更新了NSManagedObjectContext Class Reference和Core Data Programming Guide文档,明确支持串行GCD调度队列和NSOperationQueues作为同步访问NSManagedObjectContext
的可接受机制.但他们的建议似乎模棱两可,可能相互矛盾,我想确保我已经正确理解了.
以前,人们普遍认为NSManagedObjectContext
只能从创建它的线程访问,使用串行队列进行同步是不够的;虽然串行队列一次只执行一个操作,但这些操作可能会安排在不同的线程上,MOC不喜欢这样.
但现在,从编程指南中,我们有:
您可以使用线程、串行操作队列或调度队列来实现并发.为了简洁起见,本文通篇使用"线程"来指代其中任何一个.
到目前为止,一切都很好(尽管它们将线程和队列混为一谈无济于事).所以我可以安全地在每个(串行)队列中使用一个上下文,而不是在每个操作/块中使用一个上下文,对吗?苹果甚至在核心数据WWDC会议上对这一点进行了可视化描述.
但是在哪里为队列创建上下文?在NSManagedObjectContext
份文件中,苹果声明:
[A context]假设默认所有者是分配它的线程或队列,这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.
所以现在我们有了一个 idea ,NSManagedObjectContext
需要知道它的主人是谁.我假设这意味着队列中要执行的第一个操作应该创建MOC,并保存对它的引用,供其他操作使用.
是这样吗?我犹豫不决的唯一原因是NSManagedObjectContext
篇文章接着说:
相反,您应该将一个引用传递给持久存储协调器,并让接收线程/队列创建一个由此派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.
苹果现在似乎把操作和安排执行的队列混为一谈.这让我很惊讶,我想知道他们是否真的希望你为每一个操作创建一个新的主运行中心.我错过了什么?