J'ai un NSFetchedResultsController comme source de données et j'implémente NSFetchedResultsControllerDelegate dans mon UITableViewController personnalisé. J'utilise sectionNameKeyPath pour diviser mon ensemble de résultats en plusieurs sections.Comment gérez-vous les insertions de section avec un NSFetchedResultsController?
Dans l'une de mes méthodes, j'ajoute un couple d'objets au contexte, tous dans une nouvelle section. Au moment où je sauvegarde les objets, les méthodes déléguées sont appelées correctement. L'ordre des événements:
// -controllerWillChangeContent: fires
[self.tableView beginUpdates]; // I do this
// -controller:didChangeSection:atIndex:forChangeType: fires for section insert
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]];
// -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath fires many times
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITavleViewRowAnimationFade]; // for each cell
// -controllerDidChangeContent: fires after all of the inserts
[self.tableView endUpdates]; // <--- Where things go terribly wrong!!!
Le dernier appel, « endUpdates », l'application se bloque toujours:
Serious application error. Exception was caught during Core Data change processing:
[NSCFArray objectAtIndex:]: index (5) beyond bounds (1) with userInfo (null)
Il semble que les mises à jour de la table ne sont pas en phase avec les données NSFetchedResultsController dans certains chemin, et les choses explosent. Je suis les docs sur NSFetchedResultsControllerDelegate, mais cela ne fonctionne pas. Quelle est la bonne façon de le faire?
MISE À JOUR: J'ai créé un projet de test qui présente ce bogue. Vous pouvez le télécharger à: NSBoom.zip
Merci! Cette observation (les doubles mises à jour) m'a permis de trouver une solution de contournement que je peux utiliser. –