0

NSFetchedResultsControllerの問題は、データをフェッチした結果、がnilに設定されたUITableViewが設定されていることです。後でpredicateNSFetchedResultsControllerに変更し、perfromFetchと呼び出すと、UITableViewは更新されませんが、NSFetchedResultsControllerのデータは更新されます。一つのことは、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

uが自己としてNSFetchedResultsControllerデリゲートを設定しています? –

+0

はい私はして、値を後でチェックします。デリゲートは元のままです。 –

+0

いくつかのコードを投稿して、あなたのプロジェクトで起こっていることを想定することは非常に困難です。コードの関連部分を投稿すると、より良い解決策を提案するのに役立ちます。 –

答えて

0

fetchedResultsCoコントローラは高価ではない。あなたは、必要に応じてそれらを作成し、破壊することを躊躇してはいけません。述語を変更する必要があるときは、現在のfetchedResultsControllerを破棄して新しいものを作成します。そうした後、tableViewをリロードすることを忘れないでください。

変更はあなたがスレッドを監視しているので、fetchedResultsControllerをトリガされませんが、あなたの述語は、メッセージに基づいています。したがって、メッセージが変更された場合、fetchedResultsControllerの変更をトリガしません。コントローラーは、1つのエンティティーに対する変更のみをモニターし、他のエンティティーへの変更がそれを実行することは期待しません。これはいくつかの方法で修正できます:1)メッセージを見てスレッドでグループ化し、すべてのセクション(つまりスレッド)を行として表示するようにfetchedResultsControllerを設定します。 2)メッセージを変更するたびに、スレッドも変更します(message.thread.threadId = message.thread.threadIdは、fetchedResultsControllerに関する変更としてカウントされます)。あなたは明確にするため、それを削除する必要がありますので、またfetchBatchSize

はfetchedResultsControllerから尊敬されていません。

関連する問題