Domanda

I seguenti passaggi provocano un arresto anomalo in NSFetchedResultsController.

  1. Provo ad aggiungere il primo elemento a un TableView supportato da NSFetchedResultsController.
  2. Creo un oggetto MO temporaneo e visualizzo un riquadro Vista modale per aggiungere un nuovo oggetto.
  3. Sul foglio Aggiungi (un controller di visualizzazione modale), premo il pulsante Annulla per eliminare il nuovo elemento.
  4. Nel pulsante di richiamata CancelAction per Annulla, elimino il nuovo oggetto temporaneo che ho creato.
  5. 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.
  6. 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) '

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top