CoreData 多线程
Posted
技术标签:
【中文标题】CoreData 多线程【英文标题】:CoreData Multi-Threaded 【发布时间】:2016-04-12 14:50:35 【问题描述】:我在多线程环境中使用 CoreData 时遇到问题。
我有一个 RestKit 设置,这意味着有一个 persistentManagedObjectContext(私有),我创建了一个子上下文(self.autoSyncMOC,也是私有的)。我没有触及 RestKit(主线程)的 mainManagedObjectContext,它是persistentMOC(我的autoSyncMOC 的兄弟)的子代。
@property (nonatomic, strong) NSManagedObjectContext *autoSyncMOC;
这是引发 Multithreading_Violation_AllThatIsLeftToUsIsHonor 异常的代码:
self.autoSyncMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
self.autoSyncMOC = [RKObjectManager sharedManager].managedObjectStore.persistentStoreManagedObjectContext;
[self.autoSyncMOC performBlockAndWait:^
//do normal fetch
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:...];
fetchRequest.predicate =[NSPredicate...
NSArray *result = [self.autoSyncMOC executeFetchRequest:fetchRequest error:nil];
//do stuff with fetched objects (i.e. set a property)
for (DownloadableItem *item in result)
item.checksumDownload = @"test";
//save context
[self.autoSyncMOC save:...];
];
这里有什么问题?我想我仍然不明白这些概念。
我知道需要更多代码和上下文才能给出正确答案。我只想知道我的代码是否有效。
谢谢!
【问题讨论】:
我刚刚做了另一个让我感到困惑的测试:当我将上下文保存在属性中时,代码会抛出异常。如果我只是在我的方法中创建它,一切都会按预期工作。有人可以解释一下吗? 你把它保存到一个属性是什么意思?您是在重新创建它而不是将其存储在静态属性中吗? 我将它保存在一个静态属性中。在单例类中只创建一次。 您是否在此块中从主线程(或其他)NSManagedObject 访问任何属性,例如在创建谓词或获取请求时? autoSyncMOC 是如何创建的?请显示更多代码。 刚刚添加了一些代码。我没有访问我的块中的任何 NSManagedObject。 【参考方案1】:看起来这是一个错误。不幸的是,仍未解决:https://forums.developer.apple.com/thread/19408
【讨论】:
以上是关于CoreData 多线程的主要内容,如果未能解决你的问题,请参考以下文章