2013-09-29 2 views
0

주요 맥락 통지 : 1. writercontext NSPrivateQueueConcurrencyType 2 mainContext ParentContext:writercontext 3. 및 NSPrivateQueueConcurrencyTypeParentContext:writercontextNSManagedObjectContext 비동기 가져 오기, 저장하고 난 다음과 같이 부모 자식 컨텍스트를 가지고

배경 컨텍스트 NSMainQueueConcurrencyType와와를 내가 어떻게 할 수 백그라운드 컨텍스트에 의한 변경 사항을 주 컨텍스트에 알릴 수 있습니까?

나는 the last part: async save을 읽었지만 백그라운드에서 저장하거나 가져 오지는 않으며 UI가 차단되고 응답이 없습니다. backgound에 자식 부모 컨텍스트가있는 방법이 있고 여전히 주 컨텍스트를 알리는 중입니까?

[context performBlockAndWait:^{ 
    @try { 
     NSError *childError = nil; 
     if ([context save:&childError]) 
     { 
      [context.parentContext performBlockAndWait:^{ 
       NSError *parentError = nil; 
       if ([context.parentContext save:&parentError]) 
       { 
        //saved 
       } 
       else 
       { 
        nslog(@"Error: %@", parentError.description); 
       } 
      }]; 
     } 
     else 
     { 
      DBERROR(@"Error: %@", childError.description); 
     } 
    } 
    @catch (NSException *exception) 
    { 
     DBERROR(@"Exception: %@", exception.description); 
    } 

}]; 
+0

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? –

+0

nope 죄송합니다. –

답변

0

내가 context 당신의 배경 상황이라고 가정 :

현재 난 내 컨텍스트를 저장합니다. performBlockAndWait을 주 스레드에서 호출하면 블록이 완료 될 때까지 차단됩니다. 코드를 다음으로 바꿔야합니다 :

[context performBlock:^{ 

... 

}]; 

그런 식으로 블록이 다른 스레드에서 실행되기 때문에 주 스레드가 차단되지 않습니다.

저장에 대한 변경 사항은 mainContext으로 전파되지 않습니다. 중첩 된 컨텍스트를 직접 사용하지 않았으므로 왜이 방식으로 작동하는지 확신 할 수 없습니다 (컨텍스트간에 수동으로 변경 내용을 병합해야 할 수도 있습니다).