为什么我应该在main中为串行队列创建上下文并为并发队列启动?

时间:2012-06-27 10:56:09

标签: ios core-data concurrency documentation nsoperation

Core Data programming Guide中有关于线程限制模式的主题,它说

  

您必须在将使用的线程上创建托管上下文。如果使用NSOperation,请注意在与调用者相同的线程上调用其init方法。因此,您不能在队列的init方法中为队列创建托管对象上下文,否则它将与调用方的线程相关联。 相反,您应该在main(用于串行队列)或start(用于并发队列)中创建上下文。

我无法得到为什么是这样的?区别在哪里?

2 个答案:

答案 0 :(得分:2)

它说明了你引用的文档中的原因。操作init方法在调用者线程上运行,而main方法中发生的工作可能在另一个线程上运行。

由于您无法在线程之间共享托管对象上下文,因此您需要在与使用它相同的线程上创建它。因此,如果在操作中使用它,则需要确保在运行操作的同一线程上创建上下文。

串行操作在main中创建上下文的原因是它们在您实现并发操作时覆盖start时运行默认的start实现。

您可以在Concurrency Programming Guide(提示:搜索“开始”)中详细了解并发操作的工作原理

答案 1 :(得分:0)

大卫是对的。

文档说明,例如,如果您有一个名为NSOperation的{​​{1}}子类,并且您覆盖MyOperation方法,如下所示

init

然后,如果你在主线程中实例化该操作,如

- (id)init
{
   if(self = [super init]) {

        // your context here       
   }

   return self;
}

您创建的上下文与主线程链接, NOT 与操作所在的线程相关联。

当您在托管对象上执行更改(删除,更新等)时可能会发生奇怪的事情,因为您在后台更改它们但访问主线程中的上下文。

改为覆盖MyOperation* op = // alloc-init 并在那里创建上下文:

main