2012-06-15 767 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) 

¿Cuál es el problema?_PFBatchFaultingArray objectAtIndex:

Cancela directamente en main. Entonces ni siquiera sé qué línea causa esto.

Sugerencia: ejecutar en el simulador. Ejecutar en mi iPhone. No se ejecuta en el iPhone de mi amigo.

Respuesta

8

Usted Relly no dio suficiente información para cualquier conjeturas ... pero aquí son:

  1. ¿Utiliza CoreData? Alguien piensa que su CoreData contiene datos, pero cuando se le pregunta no hay ninguno. Se produciría un bloqueo cuando alguien preguntara fetchedResultsController.fetchedObjects por el primer objeto (índice 0 como se menciona en el informe de fallos), pero eso no existe (más allá de los límites 0 en el informe de fallos)
  2. "index beyond bounds" es un error genérico nota relacionada con matrices. Los informes de error dicen que alguien estaba pidiendo el primer elemento de la matriz (índice 0), pero esa matriz estaba vacía (límites 0). Eso es un choque.

Fix es asegurarse de que hay datos antes de preguntar por ello. Una forma es comprobar

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

De todas formas, mi mejor conjetura es que PFBatchFaultingArray se refiere a CoreData y eso significa que no hay respuestas fáciles.

¿Sabías que ...? error de autenticación, que forzó la actualización de CoreData, pero los FRC todavía apuntan a datos antiguos? Se producirá un bloqueo, cuando el "viejo" frc piensa que todavía hay tantos datos como la última vez, pero los datos "nuevos" en CoreData son en realidad menos numerosos. Entonces la actualización automática de UITableView estaría pidiendo datos para la fila, que ya no existe == crash. Luego debe actualizar sus archivos ANTES de que alguien intente usar los datos. Solo usted sabrá cuándo y dónde se puede hacer esa actualización.

9

Ok, creo que descubrí por qué. Es debido a la memoria caché en NSFetchedResultsController. Es horrible. Si incluso cambia el NSSortDescriptor de ascendente a descendente, debe eliminar el caché manualmente.

Así que cuando el contexto cambia y la memoria caché no se da cuenta de esto, se pone molesto y arroja errores como el que ve. Esto puede suceder cuando aciertes build en XCode: el contexto no se ha guardado (y pierde sus datos) pero el caché cree que debería tenerlo, por lo que cuando se reinicia con cero datos, se sorprende y no sabe cómo manejarlo.

Al eliminar la memoria caché se elimina este problema. Creo que esta puede ser la razón por la cual Apple dejó de usarlo con UICollectionViewController. Solo un problema así.

EDITAR: comprobar si la fila/sección no supera el recuento respectivo de NSFetchedResultsController no funciona, porque una vez más, PIENSA que los datos deberían estar allí, pero no es así.

+1

¿cómo se elimina la memoria caché de forma manual? – Lytic

+0

NSFetchedResultsController.deleteCacheWithName() – powertoold

1

Si está configurando un "propertiesToFetch" en NSFetchRequest, y si esas propiedades son nulas en la base de datos, entonces obtendrá este error también.

La solución es hacer que esa propiedad sea opcional y no la recupere previamente.

Ejemplo:

si 'Estudiante < ---> Mochila' es su modelo.

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

    ... 

El bloqueo ocurre cuando la mochila es nula.

Cuestiones relacionadas