2010-03-08 104 views
7

我有一个问题,我在后台线程中更新多对多关系,这在threa中正常工作,但是当我将对象发送回主线程更改不显示。如果我关闭了应用程序并重新打开,数据保存正常并且更改显示在主线程中。还使用[上下文锁定]而不是一个不同的托管对象上下文工作正常。核心数据管理的对象上下文线程同步

我已经试过的NSManagedObjectContext:

- (BOOL)save:(NSError **)error; 
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;  

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

我的核心数据的代码使用下面的吸气剂,以确保所有操作都是线程安全的:

- (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; 
    } 
} 

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

-(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; 
} 

任何帮助表示赞赏

+0

编辑:我错过了你以前使用threadDictionary。 – Wendel 2011-08-15 22:35:06

回答

9

如果您将后台上下文保存在后台线程中,然后在主线程上侦听NSManagedObjectContextObjectsDidChangeNotification,则可以拨打-mergeChangesFromContextDidSaveNotification:主要上下文(在主线程上),只要在后台线程上执行保存,更改就会显示出来。

相关问题