1

使用 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 与当前线程相关联。这对我来说似乎是一个合理的解决方案,但它也显得又快又松。

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

4

1 回答 1

1

你应该反过来:使用

[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]]

创建一个上下文

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

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

有关更多信息,请参阅“OS X v10.7 和 iOS 5.0 的核心数据发行说明”中的托管对象上下文的并发支持。

于 2013-03-08T18:29:07.920 回答