Core data 核心数据单托管对象上下文和两个线程

Core data 核心数据单托管对象上下文和两个线程,core-data,nsmanagedobjectcontext,Core Data,Nsmanagedobjectcontext,我想弄明白这件事,快发疯了。我正在开发一个从Web服务器同步数据的应用程序。有一个后台线程正在将数据从服务器拉到应用程序。同时,我正在对UI进行更改。在UI上更改的值将保存到前台的核心数据中 在整个应用程序中,我有一个managedObjectContext,每次创建fetchController时,我都会从应用程序委托获取它。应用程序代理代码 - (NSManagedObjectContext *)managedObjectContext { if (__managedObjectCo

我想弄明白这件事,快发疯了。我正在开发一个从Web服务器同步数据的应用程序。有一个后台线程正在将数据从服务器拉到应用程序。同时,我正在对UI进行更改。在UI上更改的值将保存到前台的核心数据中

在整个应用程序中,我有一个managedObjectContext,每次创建fetchController时,我都会从应用程序委托获取它。应用程序代理代码

- (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil) {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}
现在的问题是,我在尝试保存上下文时出错。错误在代码中随机发生。只要我对任何实体进行更改,我就会保存上下文。另外,我在每个实体中都有两种关系,一种是与孩子的关系,一种是与多人的关系,另一种是与父母的关系,一种是与一人的关系。所有的关系都有适当的反比


我想我在这里做了一件概念上错误的事情,我只需要记住一个上下文。在后台线程和前台线程都在读写coredata的情况下,您能告诉我应该如何管理上下文吗。谢谢。

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

  • 创建上下文时使用队列并发类型之一--请参阅文档以了解
    initWithConcurrencyType:
    。然后,无论何时访问数据存储,都可以使用
    performBlock:
    performBlock和wait:
    同步访问

  • 为后台线程创建新的托管对象上下文。使用
    NSManagedObjectContextDidSaveNotification
    mergeChangesFromContextDidSaveNotification:
    保持多个上下文同步


  • 但无论您做什么,请不要在多个线程上使用一个托管对象上下文。

    您正在使用线程限制初始化MOC,因此只能在创建它的线程上使用它。。。很可能是主线。它本身没有什么问题。。。但是如何创建用于后台保存的MOC?如果你使用的是同一个主运行中心,那就是你的问题。阅读关于核心数据并发性的文档。