如何创建具有在不同队列/线程上运行的非NSManagedObjectContext
nil
的{{1}}?
parentContext
的managedObjectContext确实有这个,但我不知道如何在不使用UIManagedDocument
的情况下复制它。
这是我正在使用的代码,结果是UIManagedDocument
managedObjectContext
属性为parentContext
。
nil
答案 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:
来确保上下文的操作实际发生在正确的队列中