我疯狂地试图解决这个问题。我正在开发一个同步来自网络服务器的数据的应用程序。有一个后台线程将数据从服务器提取到应用程序。同时我正在对UI进行更改。 UI上更改的值将保存到前台的核心数据中。
在整个应用程序中,每次创建fetchController时,我都会从app委托中获取一个managedObjectContext。应用代理代码
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil) {
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
现在问题是我在尝试保存上下文时遇到错误。错误在代码中随机发生。一旦我对任何实体进行更改,我就会保存上下文。此外,我在每个实体中都有两个关系,每个实体一个与其子节点一对多,一个与其父节点相关 - 一个。所有的关系都有适当的逆。
我认为我在这里通过一个上下文来做一些概念错误的事情。在背景和前台线程正在读取和写入coredata的情况下,您能否建议我如何管理上下文?感谢。
答案 0 :(得分:0)
托管对象上下文不是线程安全的,因此如果您在不考虑并发性的情况下在多个线程上使用相同的内容 - 那么您将遇到重大问题。如在,崩溃和/或数据丢失,甚至数据损坏。有几种方法可以解决这个问题:
在创建上下文时使用其中一个队列并发类型 - 请参阅initWithConcurrencyType:
的文档。然后,无论何时访问数据存储,都可以使用performBlock:
或performBlockAndWait:
来同步访问权限。
为后台线程创建新的托管对象上下文。使用NSManagedObjectContextDidSaveNotification
和mergeChangesFromContextDidSaveNotification:
可以保持多个上下文同步。
但无论你做什么,不只需在多个线程上使用一个托管对象上下文。