多线程核心数据合并错误

时间:2011-04-04 15:51:43

标签: core-data

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

[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_BAD_ACCESS”错误。

如何在单独的线程中插入核心数据并与新对象建立关系?它在主线程上工作正常,但由于它是在applicationDidLaunched期间完成的,因此UI被锁定。

1 个答案:

答案 0 :(得分:0)

您通常不直接调用主线程上下文。相反,您在后台线程上注册保存上下文的NSManagedObjectContextDidSaveNotification的主线程上下文的对象。在最近的通知时,调用主线程上下文的NSManagedObjectContextDidSaveNotification:并将通知对象传递给它。然后主线程将自行更新。

这可以确保在尝试使用后台线程中添加或删除的任何对象之前更新主线程。