NSFetchedResultsController Crash
-
07-07-2019 - |
Question
Les étapes suivantes entraînent un blocage de NSFetchedResultsController.
- J'essaie d'ajouter le premier élément à un objet TableView sauvegardé par NSFetchedResultsController.
- Je crée un objet MO temporaire et affiche un volet de vue modale pour ajouter un nouvel objet.
- Sur la feuille d'ajout (contrôleur de vue modale), j'appuie sur le bouton Annuler pour ignorer le nouvel élément.
- Dans le bouton CancelAction du bouton Annuler, je supprime le nouvel objet temporaire que j'ai créé.
- Le code jusqu’ici est exactement similaire au code exemple Apple pour Core Data. Le seul code supplémentaire dont je dispose est un appel à [tableView reloadData] après que la feuille d'ajout est rejetée.
- Le crash ne survient que si j'essaie d'ajouter le premier élément, car il est lié à un nombre de sections incorrect dans NSFetchedResultsController.
Ceci provoque un crash donné ci-dessous. Si je supprime l'appel redondant à reloadData, le blocage n'est pas visible. Si j'ajoute un appel reloadData aux exemples de code de recette, le blocage se produit également.
Est-ce un problème connu de NSFetchedResultsController?
2009-09-13 18: 22: 45.600 Recipes [14926: 20b] * Application terminée en raison d'une exception non interceptée 'NSRangeException', raison: '* - - NSCFArray objectAtIndex:]: index ( 0) au-delà des limites (0) '
La solution
Comme vous l'avez découvert vous-même, vous ne devez PAS utiliser [tableView reloadData], car vous utilisez probablement les méthodes de délégation NSFetchedResultsController
– controllerWillChangeContent:
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
– controller:didChangeSection:atIndex:forChangeType:
– controllerDidChangeContent:
Ces méthodes sont en réalité chargées de mettre à jour votre vue tableau lorsque vous ajoutez, supprimez ou modifiez des objets. Par conséquent, lorsque vous ajoutez l'appel à [tableView reloadData], deux threads différents accèdent / modifient votre vue tabulaire. Cela provoque le crash que vous rencontrez.
Si vous n'utilisez pas les méthodes de délégation, le blocage est dû à quelque chose d'autre dans votre code.