核心数据单一管理对象上下文和两个线程

时间:2013-04-24 13:58:21

标签: core-data nsmanagedobjectcontext

我疯狂地试图解决这个问题。我正在开发一个同步来自网络服务器的数据的应用程序。有一个后台线程将数据从服务器提取到应用程序。同时我正在对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的情况下,您能否建议我如何管理上下文?感谢。

1 个答案:

答案 0 :(得分:0)

托管对象上下文不是线程安全的,因此如果您在不考虑并发性的情况下在多个线程上使用相同的内容 - 那么您将遇到重大问题。如在,崩溃和/或数据丢失,甚至数据损坏。有几种方法可以解决这个问题:

  1. 在创建上下文时使用其中一个队列并发类型 - 请参阅initWithConcurrencyType:的文档。然后,无论何时访问数据存储,都可以使用performBlock:performBlockAndWait:来同步访问权限。

  2. 为后台线程创建新的托管对象上下文。使用NSManagedObjectContextDidSaveNotificationmergeChangesFromContextDidSaveNotification:可以保持多个上下文同步。

  3. 但无论你做什么,只需在多个线程上使用一个托管对象上下文。