如何使用非nil parentContext创建NSManagedObjectContext?

时间:2013-03-15 11:41:04

标签: objective-c cocoa core-data nsmanagedobjectcontext uimanageddocument

如何创建具有在不同队列/线程上运行的非NSManagedObjectContext nil的{​​{1}}?

parentContext的managedObjectContext确实有这个,但我不知道如何在不使用UIManagedDocument的情况下复制它。

这是我正在使用的代码,结果是UIManagedDocument managedObjectContext属性为parentContext

nil

2 个答案:

答案 0 :(得分:1)

创建NSManagedObjectContext后,如果需要将父上下文作为子上下文,则必须分配父上下文。

[newContext setParentContext:mainThreadManagedObjectContext];

在这种情况下,您甚至不必分配持久性存储。来自文档:

  

您现在可以使用setParentContext:指定父管理对象上下文,而不是为托管对象上下文指定持久性存储协调器。这意味着获取和保存操作由父上下文而不是协调器调解。

答案 1 :(得分:1)

您可以通过分配子上下文并设置其父上下文来创建子上下文:

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] init];
[childContext setParentContext:[self managedObjectContext]];

持久性存储协调器继承自父上下文,因此这就是创建子级所需的全部内容。 父上下文必须使用其中一种基于队列的并发类型。这意味着上面创建上下文的代码必须改为:

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];

还有NSPrivateQueueConcurrencyType。哪个更好取决于您的应用程序的设计。

在不同的队列/线程上运行事情是另一回事。这绝不是自动的。您的代码在您调用它的任何队列或线程上运行。 Core Data的直接支持仅限于使用其中一种基于队列的并发类型 - 但是您需要确保使用performBlock:performBlockAndWait:来确保上下文的操作实际发生在正确的队列中