5

Tengo una aplicación que utiliza una vista de tabla para mostrar una lista de elementos formar mis datos básicos. Estoy usando una API remota y estoy actualizando mi contenido después de bajar la vista de tabla, esto desencadena una llamada a la API.NSFetchedResultsController excepción delegado

se recuperan los datos, analiza y se inserta/modificada en mi Core Data.

Soy a veces recibiendo un error después de guardar mi contexto de Datos Core ... Tenga en cuenta que no estoy usando múltiples hilos para esto y como dije, parece que no siempre sucede.

Literalmente me estoy volviendo loco. Parece que este tipo tiene un problema similar, pero sigo siendo incapaz de fijar la mina con su solución: CoreData error driving me crazy... CoreData: Serious application error. An exception caught from delegate of NSFetchedResultsController

Aquí está el error completo:

2012-07-31 14:14:47.332 MyApp[2893:11303] 
*** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], 
/SourceCache/UIKit_Sim/UIKit-1914.84/UITableViewSupport.m:1133 
2012-07-31 14:14:47.332 MyApp[2893:11303] CoreData: error: Serious application error. 
An exception was caught from the delegate of NSFetchedResultsController during a call to - 
controllerDidChangeContent:. 
Attempt to create two animations for cell with userInfo (null) 

ACTUALIZACIÓN:

tengo un predicado en mi solicitud de búsqueda. Para parecer que se están eliminando objetos descargados previamente de la API y que faltan en el nuevo resultado de JSON. Estoy configurando un indicador hideFromUser, esto se guarda en mis datos principales.

Si esta bandera es sí, entonces no aparece en la vista de tabla. Pero si está bien, entonces sí. También estoy actualizando información sobre ese objeto administrado si algo cambiara. ¿Es posible que tenga un objeto que estaba previamente configurado para ocultar ... y ahora está configurado para mostrarse, y también tenía algunos datos nuevos, podría esto desencadenar una "célula debería actualizarse" y una "célula debería insertar"?

más lo pienso menos parece ser relevante.

Así es como estoy actualizando mis datos:

1) configurar todos los objetos relevantes del tipo correspondiente a "ocultar formulario de usuario" (NSPredicate asegura que no se muestran en la Tabla).

2) me sale un NSArray partir de los datos JSON.

3) Colocando cada elemento en bucle, mi createABookOfClass: withJSON: el método consulta los datos básicos de un libro (utilizando una ID del diccionario json); si no lo encuentra, crea uno nuevo. Nota: en este punto se revierte el "ocultar del indicador de usuario".

4) Después de todo se hace, salvo.

[[DPLocalStore getInstance] hideFlagItemsOfType:NSStringFromClass([MyFavouriteBook class])]; 

NSArray * itemsJSON = [data mutableObjectFromJSONData]; 

[itemsJSON enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) {  
    [[DPLocalStore getInstance] createABookOfClass:[MyFavouriteBook class] 
              withJSON:obj]; 
}]; 

NSError *error = nil; 
BOOL didsave = [[DPLocalStore getInstance] save:&error]; 

Tal vez lo que está sucediendo es un objeto de celda que contiene A se ha actualizado, es la actualización: ocultar la bandera ha cambiado. así me estoy metiendo en una situación en la que el delegado del NSFetchedResultsController quiere actualizar esa celda, y eliminarla también ... ya que el predicado ahora no corresponde a este objeto ... Ese sonido muy probablemente ...

+1

¿Puede publicar el código donde inserta/actualiza los datos? –

+0

Realmente es simple el análisis de una matriz json y la creación de un conjunto de nsmanagedobjects, después del ciclo guardo el contexto. Nada especial está ocurriendo aquí. ¿Tal vez si le doy acceso a mi repositorio BitBucket? Tal vez estas dos animaciones para una célula ... Solo tuve un pensamiento, por favor revise mi pregunta actualizada. Gracias. – Daniel

+0

Het Martin, debería haber publicado un código más como el que dijiste, verifica mi respuesta. Aclamaciones. – Daniel

Respuesta

9

I Creo que puedo haber encontrado el error, ya que lo cambié. No he experimentado el problema, así que estoy asumiendo que está bien.

En mi aplicación de controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: que tenía esto en la sentencia switch para NSFetchedResultsChangeMove:

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 

    // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
    [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] 
      withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

Tal y como se utiliza en un proyecto mayor (que yo no era parte de), asumí toda la controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: aplicación era bien, ya que esto es más una plantilla en lugar de algo, harás cualquier cosa personalizada.

En consecuencia, no le presté mucha atención hasta que lo leí nuevamente en el sitio para desarrolladores de Apple. Y noté que, en el caso de NSFetchedResultsChangeMove, debe eliminar una celda e insertar la celda en la nueva ruta. Sin embargo, lo había implementado sin darme cuenta: ¡elimine la celda y vuelva a cargar la sección!

En efecto lo que debería y ahora tienen la siguiente:

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

Como he dicho yo no he tenido un problema desde entonces. Me encantaría saber de alguien qué funcionamiento interno sería responsable de esto, la excepción fue "Intento de crear dos animaciones para la célula".

Gracias por cualquier interés.

+0

¡Me salvaste el día, gracias! –

+0

Supongo que hay algún tutorial o código fuente que hayamos copiado y usado. Dado que esto es un tema repetitivo ... Apple también tiene la implementación (correcta) aquí http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/Reference/Reference.html – Daniel

+0

Este código está todavía incorrecto. Se supone que debes llamar a beginUpdate y endUpdate en las acciones de la vista de tabla para insertar/actualizar/eliminar. Anidan esos beginUpdate/endUpdates para sincronizar las animaciones de la vista de tabla sincrónica. Es por eso que obtuviste el error de animación duplicado. – Derek

Cuestiones relacionadas