核心数据托管对象上下文线程同步

Ben*_*ves 7 iphone core-data

我有一个问题,我在后台线程中更新多对多关系,这在那个threa中运行正常,但是当我将对象发送回主线程时,更改不会显示.如果我关闭应用程序并重新打开数据保存正常,更改显示在主线程上.使用[context lock]而不是使用不同的托管对象上下文也可以正常工作.

我试过NSManagedObjectContext:

- (BOOL)save:(NSError **)error;
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;    
Run Code Online (Sandbox Code Playgroud)

在整个过程的不同阶段,但它似乎没有帮助.

我的核心数据代码使用以下getter来确保任何操作都是线程安全的:

- (NSManagedObjectContext *) managedObjectContext 
{   

    NSThread * thisThread = [NSThread currentThread];
    if (thisThread == [NSThread mainThread]) 
    {
        //Main thread just return default context
        return managedObjectContext;
    }
    else 
    {
        //Thread safe trickery
        NSManagedObjectContext * threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:CONTEXT_KEY]; 
        if (threadManagedObjectContext == nil)
        {
            threadManagedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];
            [threadManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]];
            [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:CONTEXT_KEY];
        }

        return threadManagedObjectContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在使用的线程之间传递对象时

-(NSManagedObject*)makeSafe:(NSManagedObject*)object
{
    if ([object managedObjectContext] != [self managedObjectContext])
    {               
        NSError * error = nil;
        object =  [[self managedObjectContext] existingObjectWithID:[object objectID] error:&error];

        if (error) 
        {
            NSLog(@"Error makeSafe: %@", error);
        }
    }

    return object;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏

Mar*_*rra 9

如果将后台上下文保存在后台线程上然后监听NSManagedObjectContextObjectsDidChangeNotification主线程,则可以调用-mergeChangesFromContextDidSaveNotification:主上下文(在主线程上),并且只要在后台线程上执行保存就会显示更改.