2012-06-15 11 views
9
2012-06-15 17:53:25.532 BadgerNew[3090:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)' 
*** First throw call stack: 
(0x353f688f 0x3779d259 0x353f6789 0x353f67ab 0x35d5fee3 0x5a5c9 0x59fd3 0x43819 0x32e63c8b 0x38153 0x38309 0x32e63c8b 0x4142d 0x32e63c8b 0x32ec363d 0x32ec35db 0x32ec2f15 0x32ec2c49 0x35d21 0x32e62cab 0x32e5c7dd 0x32e2aac3 0x32e2a567 0x32e29f3b 0x36fe922b 0x353ca523 0x353ca4c5 0x353c9313 0x3534c4a5 0x3534c36d 0x32e5b86b 0x32e58cd5 0x35a73 0x35a54) 
terminate called throwing an exception(lldb) 

Qual è il problema?_PFBatchFaultingArray objectAtIndex:

Si interrompe a destra. Quindi non so nemmeno quale linea causi questo.

Suggerimento: eseguire sul simulatore. Corri sul mio iPhone. Non funziona sull'iPhone del mio amico.

risposta

8

si induceva ad allontanarsi non ha dato abbastanza informazioni per qualche ipotesi ... ma qui si sono:

  1. Usi CoreData? Qualcuno pensa che il tuo CoreData contenga dati, ma quando viene chiesto non ce n'è. Si verificherebbe un errore quando qualcuno chiede fetchedResultsController.fetchedObjects per il primo oggetto (indice 0 come menzionato nel rapporto di arresto anomalo), ma non esiste (oltre i limiti 0 nel rapporto di arresto anomalo)
  2. "indice oltre i limiti" è un errore generico nota relativa agli array. Le segnalazioni di errore dicono che qualcuno stava chiedendo il primo elemento dell'array (indice 0), ma quell'array era vuoto (limiti 0). Questo è un incidente.

Correzione è assicurarsi che ci sono dati prima di chiedere per esso. Un modo è quello di verificare

if ([myArray count] > index) 
    value = [myArray objectAtIndex:index]; 

In ogni modo, la mia ipotesi migliore è che si riferisce a PFBatchFaultingArray CoreData e questo significa che non ci sono risposte facili.

Hai avuto ad es. errore di autenticazione, che ha forzato l'aggiornamento di CoreData, ma i FRC puntano ancora ai vecchi dati? Crash potrebbe accadere, quando "old" crc pensa che ci siano ancora tanti dati quanti l'ultima volta che è apparso, ma i "nuovi" dati in CoreData sono in realtà meno numerosi. Quindi l'aggiornamento automatico di UITableView richiederebbe i dati per la riga, che non esiste più == crash. Quindi è necessario aggiornare i propri pezzi PRIMA che qualcuno cerchi di utilizzare i dati. Solo tu saprai, quando o dove può essere fatto l'aggiornamento.

9

Ok, penso di aver capito perché. È causa della cache in NSFetchedResultsController. È schifoso. Se anche si modifica NSSortDescriptor da ascendente a discendente, è necessario eliminare la cache manualmente.

Quindi, quando il contesto cambia e la cache non si rende conto di ciò, diventa pissing e genera errori come quello che vedi. Questo può accadere quando premi build in XCode: il contesto non ha salvato (e perde i suoi dati) ma la cache pensa che dovrebbe averlo quindi quando si riavvia con zero dati, rimane sorpreso e non sa come gestirlo.

La rimozione della cache elimina questo problema. Penso che questo potrebbe essere il motivo per cui Apple ha smesso di usarlo con UICollectionViewController. Proprio un tale problema.

MODIFICA: controllare se la riga/sezione non supera il conteggio rispettivo di NSFetchedResultsController non funziona, perché, di nuovo, PENSA che i dati dovrebbero essere lì ma non lo è.

+1

come si elimina la cache manualmente? – Lytic

+0

NSFetchedResultsController.deleteCacheWithName() – powertoold

1

Se si imposta "propertiesToFetch" su NSFetchRequest e se tali proprietà sono nul nel database, verrà visualizzato anche questo errore.

La correzione consiste nel rendere questa proprietà facoltativa e non precaricarla.

Esempio:

se 'Student < ---> Zaino' è il tuo modello.

let fetchRequest = ... 
    fetchRequest.propertiesToFetch = ["backpack"] 

    ... 

L'incidente si verifica quando lo zaino è zero.

Problemi correlati