1

그래서 NSFetchedResultsController 및 대리인에 대한 많은 질문/답변이 있습니다. 때로는 대의원이 불 때로는 때때로 그렇지 않습니다. Core Data는 꽤 복잡한 논의이므로 많은 시간을 들이지 않고 진행되는 일을 이해하는 것은 어렵습니다. 또한 문서에는 몇 가지 문제점이 있지만 목록에 포함되어 있지 않다고 나와 있습니다.NSFetchedResultsController 및 NSFetchedResultsControllerDelegate에 대한 설명이 필요합니다.

몇 가지 알려진 문제가과 행동은 아이폰 OS의 다양한 버전에 NSFetchedResultsController와 을 변경합니다.

따라서 이러한 클래스의 동작에 대한 몇 가지 설명이 필요합니다.

따라서 효과적으로, 그 대리자가 있는지 여부에 의해 상기 캐쉬 파일 이름이 설정되어 있는지 를 세 가지 작동 모드를 판정 된 컨트롤러 : 특히, 본 문서에서 다음이 기입된다.

추적 안 함 : 대리인이 nil로 설정됩니다. 컨트롤러는 간단히 을 사용하여 가져 오기를 실행했을 때의 데이터에 액세스 할 수 있습니다.

메모리 전용 추적 : 대리인이 0이 아니며 파일 캐시 이름이 으로 설정됩니다. 컨트롤러는 해당 결과 집합의 개체를 모니터링하고 관련 변경에 대한 응답으로 업데이트 섹션과 주문 정보를 모니터링합니다.

전체 지속 추적 : 위임자와 파일 캐시 이름은 non-nil입니다. 컨트롤러는 결과 집합의 개체를 모니터링하고 관련 변경 내용에 대한 응답으로 섹션과 주문 정보를 업데이트합니다. 컨트롤러는 계산 결과의 영구 캐시를 유지 관리합니다.

나는 매우 복잡한 응용 프로그램을 개발 그리고 난 가게에서 데이터를 검색하고 테이블에 그들을 표시 NSFetchedResultsController을 활용하고있다. 표시되는 관리 객체는 syncStatus 부울 변수를 사용하여 외부 서비스와 동기화되었는지 여부를 확인합니다. syncStatus 변수가 셀에 표시되지 않으면 다른 정보가 표시됩니다 (예 : 텍스트 값). 즉, syncStatus은 오류로 인해 실행되지 않습니다.

표에서 NSFetchedResultsController을 사용하여 동기화되지 않은 요소 만 표시합니다 (부울 값은 NO으로 설정 됨). 사람들을 위해, 그것은 또한 YESsyncStatus 변수를 변경,

- (NSFetchedResultsController*)fetchedResultsController 
{ 
    if(_fetchedResultsController) 
     return _fetchedResultsController; 

    NSManagedObjectContext* mainContext = [self managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"LocalEntity" inManagedObjectContext:mainContext]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"syncStatus == %@", [NSNumber numberWithBool:NO]]]; 
    [fetchRequest setFetchBatchSize:10]; 

    // sort descriptor here... 

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil]; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 
} 

사용자는 그녀/그가 동기화하고자하는 요소를 선택하고 백그라운드 스레드는 서비스에 선택한 요소를 전송합니다.

하면 작업은 내가 NSFecthedResultsControllerDelegate을 설정하기 때문에, 완료 및 NSManagedObjectContextDidSaveNotification (나는 또한 통지를 통해 변경. 내가 통지가 올바른 변화 개체가 포함되어 있음을 볼 수있어 메인 쓰레드에 병합 내가 등록하는 경우), 테이블이 업데이트 될 것으로 예상됩니다 (syncStatus이 설정된 개체는 YES으로 표시되지 않음).

이 질문은 다음과 같습니다.

메모리 기반 추적 옵션을 사용하기 때문에 문서에 따라 누락 된 업데이트는 사실 isSyncStatus이 메모리에로드되지 않았기 때문에 오류가 있습니까?

나를 올바른 방향으로 제안 해 주시겠습니까?

미리 감사드립니다.

P.

NSFetchedResultsControllerDelegate 메소드가 올바르게 구현됩니다. 주 스레드에서만 동일하게 작동합니다.

답변

0

NSFetchedResultsControllerDelegate 방법을 구현하여 셀을 제거하고 있습니까?

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 

    [self.tableView beginUpdates];  
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

    UITableView *tableView = self.tableView; 

    switch(type) { 
     case NSFetchedResultsChangeDelete: 

      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];  
      break; 
    }  
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 

    [self.tableView endUpdates];  
} 
+0

예, 물론입니다. 나는 내 질문에 그것을 쓰는 것을 잊었다. 감사. –

관련 문제