在私有/后台队列上创建NSManagedObjectContext:怎么办?

时间:2014-04-22 22:56:06

标签: multithreading core-data concurrency nsmanagedobjectcontext

我对如何在主线程之外的其他线程上创建MOC感到困惑。

一方面,在the doc中,可以阅读

  

这样做的结果是上下文假设默认所有者是   分配它的线程或队列 - 这由线程决定   调用它的init方法。因此,您不应该初始化a   一个线程上的上下文然后将它传递给另一个线程。

但另一方面,我看到代码中的辅助MOC按以下方式创建,主线程上的

    NSManagedObjectContext *parentContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

    [parentContext performBlockAndWait:^{
        [parentContext setUndoManager:nil]; // no point in it supporting undo
        [parentContext setPersistentStoreCoordinator:coordinator];
    }];

那么,创建辅助MOC的好方法是什么?也许我应该确切地知道这个辅助MOC是项目中心类的@property(例如AppDelegate)。

1 个答案:

答案 0 :(得分:3)

文档充其量是模棱两可的。

在我的测试中,您无需使用队列将NSManagedObjectContext附加到其父级或NSPersistentStoreCoordinator

如果您正在执行NSConfinmentConcurrencyType我在创建它的线程上设置父或协调器(因为那是可以使用它的线程)。

如果你正在做NSPrivateQueueConcurrencyType我也在创建它的线程上设置父或协调器。限制或限制为私有队列的NSManagedObjectContext的用法。我将用法定义为执行提取,删除对象等。配置NSManagedObjectContext不受限制。

这当然不在文档中,但结果是在访问NSManagedObjectContext时错误地导致异常时通过测试产生的。