0

NSFetchedResultsController의 문제점은 데이터를 반입하고 을 nil으로 설정하여 UITableView을 채우는 것입니다. 나중에 predicateNSFetchedResultsController으로 변경하고 perfromFetch이라고하면 NSFetchedResultsController의 데이터가 업데이트되지만 UITableView은 새로 고침되지 않습니다. 한 가지 더, NSFetchedResultsControllerDelegate 메소드도 호출하지 않습니다.NSfetchedResultsController가 UI에 반영되지 않는 변경 사항

미리 감사드립니다.

편집 : 추가 된 코드

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 NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

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

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeMove: 
     case NSFetchedResultsChangeUpdate: 
      break; 
    } 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
} 

NSFetchedResultsController

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

    NSManagedObjectContext *context = [GmailDBService sharedService].managedObjectContext; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Thread"]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"historyId" ascending:NO]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, ANY $m.labels.identifier == %@)[email protected] > 0", self.label.identifier]; 
    fetchRequest.sortDescriptors = @[sortDescriptor]; 
    fetchRequest.fetchBatchSize = 20; 

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

    return _fetchedResultsController; 
} 

술어 새로 고침

- (IBAction)unwindToThreadsController:(UIStoryboardSegue *)segue 
{ 
    self.fetchedResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"identifier == %@", @"15f1919682399cc9"]; 
    [self.fetchedResultsController performFetch:nil]; 
} 
+0

내가 NSFetchedResultsController 대리자를 자체로 설정 했습니까 ?? –

+0

예 값을 확인하고 나중에 확인합니다. 대의원은 그대로이며 이전과 동일합니다. –

+0

일부 코드를 게시하면 프로젝트에서 발생할 수있는 일을 추측하기가 매우 어렵습니다. 코드의 관련 부분을 게시하면 더 나은 해결책을 제안 할 수 있습니다. –

답변

0

fetchedResultsCo 관리자는 비싸지 않다. 당신은 필요에 따라 그들을 창조하고 파괴하기 위해 무서워해서는 안됩니다. 술어를 변경해야하는 경우 현재 fetchedResultsController를 버리고 새 fetchedResultsController를 작성하십시오. 그렇게 한 후에 tableView를 다시로드하는 것을 잊지 마십시오.

변경 사항은 스레드를 모니터링하지만 사용자의 술어가 메시지를 기반으로하기 때문에 fetchedResultsController를 트리거하지 않습니다. 따라서 메시지가 변경되면 fetchedResultsController에서 변경을 트리거하지 않습니다. 컨트롤러는 하나의 엔티티에 대한 변경 사항 만 모니터링하고 다른 엔티티에 변경 사항이 적용되도록 기대하지 않습니다. 몇 가지 방법으로이 문제를 해결할 수 있습니다. 1) 메시지를보고 스레드별로 그룹화 한 다음 모든 섹션 (즉 스레드) 만 행으로 표시하도록 fetchedResultsController를 설정합니다. 2) 메시지를 변경할 때마다 스레드도 변경됩니다 (message.thread.threadId = message.thread.threadId는 fetchedResultsController에 관한 한 변경으로 간주됩니다).

또한 fetchBatchSize은 fetchedResultsController에 의해 존중되지 않으므로 명확하게하기 위해 제거해야합니다.