Core data 多线程核心数据合并错误

Core data 多线程核心数据合并错误,core-data,Core Data,使用多线程核心数据的标准方法是 [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:YES]; 但是,其中一个具有外部托管对象,该对象会立即进行保存。这会产生错误。例如: - (

使用多线程核心数据的标准方法是

[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                          withObject:notification
                       waitUntilDone:YES];  
但是,其中一个具有外部托管对象,该对象会立即进行保存。这会产生错误。例如:

- (void)mergeChanges:(NSNotification *)notification
{
    NSManagedObjectContext *mainContext = [self managedObjectContext];

    // Merge changes into the main context on the main thread
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)    
                                  withObject:notification
                               waitUntilDone:YES];    
}

- (void) loadingIntoCoreData
{
    NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] init];
    [ctx setUndoManager:nil];
    [ctx setPersistentStoreCoordinator: [self persistentStoreCoordinator]];

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self
           selector:@selector(mergeChanges:) 
               name:NSManagedObjectContextDidSaveNotification
             object:ctx];
    ...
    // Create many objects
    [ctx save:&error];
    [self doSomethingWithThisCtx:ctx];
}

- (void) doSomethingWithThisCtx:(NSManagedObjectContext *)ctx{
  // Form relationships with objects create in - (void) loadingIntoCoreData
  [ctx save:&error];
}
然后在第二次[ctx save:&error]时,将抛出“EXC\u BAD\u ACCESS”错误


如何在一个单独的线程中插入核心数据并创建和新对象的关系?它在主线程上运行良好,但由于它是在
applicationidlaunched
期间完成的,因此UI会被锁定。

通常不直接调用主线程上下文。而是为后台线程上上下文的
NSManagedObjectContextDidSaveNotification
注册保存主线程上下文的对象。收到通知后,调用主线程上下文的
NSManagedObjectContextDidSaveNotification:
,并将通知对象传递给它。然后主线程将自我更新


这将确保主线程在尝试使用在后台线程上添加或删除的任何对象之前得到更新

对不起,也许我的缩写代码不清楚。我现在已经输入了完整的代码。如您所见,我正在注册通知并在收到通知后调用合并,执行主线程上下文的更新。但是,由于并发性,当主线程合并更改时,后台线程继续使用此CTX运行
doSomethingWithThisCtx
,因此会产生冲突。如果您同时在两个上下文中进行更改,则需要向另一个上下文注册更改通知,以便它们都知道发生了什么。一般来说,您应该尽可能避免这种情况。