3

메인 스레드에 NSFetchedResultsController이 있습니다. 또한 메인 스레드에서 비동기 적으로 JSON에 대한 네트워크 요청을 보냅니다. 해당 JSON 문자열이 반환되면 새 (배경) NSManagedObjectContext을 inits하고 JSON 문자열을 파싱하고 NSManagedObject을 만들고 컨텍스트에 저장하는 NSOperation을 시작합니다. 백그라운드 컨텍스트는 주 컨텍스트와 동일한 persistentStore를가집니다. 변화가 있다는 것을 주요 NSFetchedResultsController에 통보 할메인 스레드에서 NSFetchedResultsController를 무시하면 다른 스레드의 코어 데이터를 저장하지 않습니까?

  1. 내가 어떤 (모든 스레드에서) 어떤 상황에서 영구 저장소에 저장한다고 생각하지만, 지금까지이 선택하지 않는 :이, 나는이 개 질문이 모든 변경 사항. 메인 스레드의 NSFetchedResultsController에 외부 save이 있음을 알리기 위해해야 ​​할 일이 있나요? tableView이 이에 따라 업데이트됩니까?

  2. 그래서 메인 스레드에서 NSManagedObjectContextWillSaveNotification을 구독하고 모든 컨텍스트 (별도의 스레드에 완전히 존재하는 컨텍스트 포함)가 save 작업을 올바르게 수행하는지 확인합니다. apple docsnotification.userInfo에 백그라운드 배열의 "업데이트 된, 삭제 된 및 삽입 된"모델 개체 각각에 대해 3 개의 사전, 하나의 배열 사전이 있어야한다고 말합니다. 그러나 userInfo은 항상 나를 위해 nil입니다. 내가 뭘 잘못하고 있는거야?

    [[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(managedObjectContextDidSave:) 
                  name:NSManagedObjectContextWillSaveNotification 
                  object:nil]; 
    

    그리고 상황이 AppDelegate에 저장하면 방법 :

    - (void)managedObjectContextDidSave:(NSNotification *)notification { 
        DLog(@"notification: %@", notification); //not nil 
        DLog(@"notification user info: %@", notification.userInfo); // always nil... why?? 
    
        NSManagedObjectContext *theContext = notification.object; 
        if(theContext != context) { 
         DLog(@"---- SAVED ON ANOTHER CONTEXT"); 
    
         // should I notify NSFetchedResultsController that there were context saves on background threads? 
         // how can I merge contexts if userInfo is nil? 
        } 
    } 
    

    내가도의 모범 사례를 알고 싶습니다

AppDelegate에의 NSManagedObjectContextWillSaveNotification 구독 여러 개의 스레드 (별도의 NSManagedObjectContexts 포함)와 코어 데이터를 처리합니다.

답변

5

관찰해야 할 알림 이름이 NSManagedObjectContextDidSaveNotification (NSManagedObjectContextWillSaveNotification 아님)입니다.

+0

위대한! userInfo가 올바른 사전으로 채워집니다. 'NSFetchedResultsController'에게 변경 사항에 대해 알리는 것은 무엇입니까?이 변경 사항을 주 컨텍스트에 병합하거나 NSFetchedResultsController를 업데이트하는 쉬운 방법이 있습니까? – johngraham

+3

컨트롤러는 주 컨텍스트를 사용하므로이 작업을 수행하는 올바른 방법 (실제로는 유일한 방법)은 변경 내용을 해당 컨텍스트에 병합하는 것입니다. – paulbailey

+2

예, 주 컨텍스트에 '- [NSManagedObjectContext mergeChangesFromContextDidSaveNotification :]'을 사용하여 변경 사항을 병합하도록 지시해야합니다. NSFetchedResultController에 대리자가 있으면 내용을 자동으로 새로 고치고 대리자의 변경 사항을 알립니다. 그렇지 않으면'performFetch :'를 보내 내용을 다시로드 할 수 있습니다. –

관련 문제