Core Data programming Guide中有关于线程限制模式的主题,它说
您必须在将使用的线程上创建托管上下文。如果使用NSOperation,请注意在与调用者相同的线程上调用其init方法。因此,您不能在队列的init方法中为队列创建托管对象上下文,否则它将与调用方的线程相关联。 相反,您应该在main(用于串行队列)或start(用于并发队列)中创建上下文。
我无法得到为什么是这样的?区别在哪里?
答案 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