2010-03-08 71 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:主要上下文(在主線程上),只要在後臺線程上執行保存,更改就會顯示出來。

相關問題