NSFetchedResultsController Crash
-
07-07-2019 - |
Domanda
I seguenti passaggi provocano un arresto anomalo in NSFetchedResultsController.
- Provo ad aggiungere il primo elemento a un TableView supportato da NSFetchedResultsController.
- Creo un oggetto MO temporaneo e visualizzo un riquadro Vista modale per aggiungere un nuovo oggetto.
- Sul foglio Aggiungi (un controller di visualizzazione modale), premo il pulsante Annulla per eliminare il nuovo elemento.
- Nel pulsante di richiamata CancelAction per Annulla, elimino il nuovo oggetto temporaneo che ho creato.
- Il codice fino a qui è esattamente simile al codice di esempio Apple per Core Data. L'unico codice aggiuntivo che ho è una chiamata a [tableView reloadData] dopo che il foglio Aggiungi è stato eliminato.
- L'incidente si verifica solo se provo ad aggiungere il primo elemento, poiché è correlato al conteggio delle sezioni errato in NSFetchedResultsController.
Ciò provoca un arresto anomalo indicato di seguito. Se rimuovo la chiamata ridondante a reloadData, l'arresto anomalo non è visibile. Se aggiungo una chiamata reloadData ai dati del codice di esempio della ricetta, il crash si verifica anche lì.
È un problema noto con NSFetchedResultsController?
13/09/2009 18: 22: 45.600 Ricette [14926: 20b] * App in chiusura a causa dell'eccezione non rilevata 'NSRangeException', motivo: '* - [NSCFArray objectAtIndex:]: index ( 0) oltre i limiti (0) '
Soluzione
Come hai scoperto da solo, NON dovresti usare [tableView reloadData], perché probabilmente stai usando i metodi delegati NSFetchedResultsController
– controllerWillChangeContent:
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
– controller:didChangeSection:atIndex:forChangeType:
– controllerDidChangeContent:
Questi metodi sono in realtà incaricati di aggiornare la visualizzazione della tabella quando si aggiungono, eliminano o modificano oggetti. Pertanto, quando si aggiunge la chiamata a [tableView reloadData] ciò che accade è che due thread diversi accedono / modificano entrambi la visualizzazione della tabella. Questo provoca l'incidente che si sta verificando.
Se non si utilizzano i metodi delegati, l'arresto anomalo è dovuto a qualcos'altro nel codice.