Pregunta

bastante nuevo para iPhone dev. Mi aplicación utiliza la base de datos, y en un momento estoy tratando de salvar algunos datos durante un método NSFetchedResultsControllerDelegate:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

Me estoy poniendo la mayor parte de este derecho de la documentación de Apple sobre el tema. La acción de eliminación se ve así:

case NSFetchedResultsChangeDelete:
        [managedObjectContext deleteObject:anObject];
        NSError *error;
        if (![managedObjectContext save:&error]) {
            NSLog(@"WTF? %@", [error description]);
        }
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

Ahora, cuando hago esto, el objeto en cuestión se eliminará después del accidente inevitable. Así que algo bien está sucediendo. El accidente es interesante, sin embargo:

  

error de aplicación grave. Excepción fue capturado durante el proceso de cambio de Datos Básicos: No se ha podido procesar los cambios pendientes antes de guardar. El contexto sigue sucio después de 100 intentos. Normalmente, este ensuciamiento recursiva es causada por un mal método de validación, -willSave, o controlador de notificación. con userInfo (null)

     

2010-02-09 23: 02: 03,931 app2 [26664: 207] *** Terminación de aplicación debido a excepción no detectada 'NSInternalInconsistencyException', razón: 'Error al procesar los cambios pendientes antes de guardar. El contexto sigue sucio después de 100 intentos. Normalmente, este ensuciamiento recursiva es causada por un mal método de validación, -willSave, o controlador de notificación ".

Mi investigación ha aparecido algunos resultados muy limitados - bueno que tengo aquí para documentar esto, eh? :-) Pero mi intestino está diciendo que el MOC se están escribiendo en otro lugar en mi controlador, aunque puedo encontrar ninguna evidencia de que eso ocurra. El método ha viewDidLoad la NSFetchedResultsController que se utiliza para obtener los datos iniciales, pero eso es todo.

¿Alguna sugerencia sobre lo que podría ser mal aquí? Como de costumbre, su mente colectiva basada en la comunidad es muy apreciada!

Saludos, Aaron

¿Fue útil?

Solución

(Si entiendo correctamente el problema) Creo que todo lo que tiene que hacer en este caso es:

case NSFetchedResultsChangeDelete:

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

Recuerde que el método

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

se notifica después de los datos subyacentes ha cambiado. Así que creo que su objetivo ya ha sido borrada, no es necesario eliminar de forma manual. Todo lo que queda por hacer en este método es sacarlo de la tableView.

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top