使用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与当前线程相关联。这对我来说似乎是一个合理的解决方案,但它看起来也很快而且松散。
尝试这样的解决方案我应该担心什么?
答案 0 :(得分:1)
你应该走另一条路:使用
[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]]
创建
的上下文NSMainQueueConcurrencyType
- 如果您需要链接到控制器和UI对象的上下文,这些对象只需要在主线程上使用,或者NSPrivateQueueConcurrencyType
- 用于在私有后台队列上运行的上下文。对上下文中的所有操作使用performBlock
或performBlockAndWait
,这可确保在为上下文指定的队列上执行操作。
有关详细信息,请参阅“适用于OS X v10.7和iOS 5.0的核心数据发行说明”中的Concurrency Support for Managed Object Contexts。