NSManagedObjectContext:这是一个很好的线程限制模式吗?

时间:2013-03-08 17:44:25

标签: objective-c core-data thread-safety nsmanagedobjectcontext

使用Core Data,围绕线程安全问题不断跳舞。在两个不同的线程中对一个NSManagedObjectContext执行提取可确保死锁。 Apple的核心数据编程指南建议使用线程限制,但不提供可以实现此目的的模式。我在下面有一个快速而肮脏的解决方案:

- (NSManagedObjectContext *) managedObjectContext
{
    NSManagedObjectContext *moc = objc_getAssociatedObject([NSThread currentThread], _cmd);

    if (!moc && self.persistentStoreCoordinator)
    {
        moc = [[NSManagedObjectContext alloc] init];
        moc.mergePolicy = NSOverwriteMergePolicy;
        moc.persistentStoreCoordinator = self.persistentStoreCoordinator;
        objc_setAssociatedObject([NSThread currentThread], _cmd, moc, OBJC_ASSOCIATION_RETAIN);
    }

    return moc;
}

此方法将出现在管理我的应用程序中的数据堆栈的专有类中。它将MOC与当前线程相关联。这对我来说似乎是一个合理的解决方案,但它看起来也很快而且松散。

尝试这样的解决方案我应该担心什么?

1 个答案:

答案 0 :(得分:1)

你应该走另一条路:使用

[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]]

创建

的上下文
  • NSMainQueueConcurrencyType - 如果您需要链接到控制器和UI对象的上下文,这些对象只需要在主线程上使用,或者
  • NSPrivateQueueConcurrencyType - 用于在私有后台队列上运行的上下文。

对上下文中的所有操作使用performBlockperformBlockAndWait,这可确保在为上下文指定的队列上执行操作。

有关详细信息,请参阅“适用于OS X v10.7和iOS 5.0的核心数据发行说明”中的Concurrency Support for Managed Object Contexts