2010-03-08 3 views
7

나는 그 threa에서 작동하는 백그라운드 스레드에서 다 대다 관계를 업데이트 할 때 문제가 있지만 주체로 개체를 다시 보내면 스레드가 변경 사항을 표시하지 않습니다. 앱을 닫고 다시 열면 데이터가 잘 저장되고 변경 사항이 기본 스레드에 표시됩니다. 또한 다른 관리되는 개체 컨텍스트 대신 [컨텍스트 잠금]을 사용하면 문제가 없습니다. 과정 전반에 걸쳐 다른 단계에서핵심 데이터 관리 된 개체 컨텍스트 스레드 동기화

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

를하지만 도움이하지 않는 것 :

나는 NSManagedObjectContext 노력했다.

내 핵심 데이터 코드는 어떤 작업 스레드 안전 보장하기 위해 다음과 같은 게터를 사용

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

답변

9

백그라운드 스레드에 백그라운드 컨텍스트를 저장 한 다음 주 스레드에서 NSManagedObjectContextObjectsDidChangeNotification을 수신하는 경우에는 -mergeChangesFromContextDidSaveNotification:을 메인 컨텍스트 (주 스레드)에 저장하면 백그라운드 스레드에서 저장을 수행하는 즉시 변경 사항이 표시됩니다.