"DidChangeSection:" El método de delegado NSfetchedResultsController no se llama

Tengo un controller de vista dividida estándar, con una vista de detalle y una vista de tabla. Al presionar un button en la vista de detalle puede hacer que un object cambie su location en el order de la vista de la tabla. Esto funciona bien, siempre que el cambio de pedido resultante no dé como resultado la adición o eliminación de una sección. Es decir, un object puede cambiar su pedido en una sección o cambiar de una sección a otra. Aquellos pedidos de cambios funcionan correctamente sin problemas. Pero, si el object intenta moverse a una sección que todavía no existe, o es el último object que abandona una sección (por lo tanto, requiere que la sección se elimine), la aplicación se bloquea.

NSFetchedResultsControllerDelegate tiene methods para manejar las secciones que se agregan y quitan y que deben llamarse en esos casos. Pero esos methods de delegates no se están llamando por alguna razón.

El código en cuestión es repetitivo:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { NSLog(@"willChangeContent"); [self.tableView beginUpdates]; } - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { NSLog(@"didChangeSection"); switch(type) { case NSFetchedResultsChangeInsert: [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { NSLog(@"didChangeObject"); UITableView *tableView = self.tableView; switch(type) { case NSFetchedResultsChangeInsert: [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeUpdate: [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; break; case NSFetchedResultsChangeMove: [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { NSLog(@"didChangeContent"); [self.tableView endUpdates]; [detailViewController.reminderView update]; } 

Iniciar la aplicación y hacer que el último object salga de una sección da como resultado el siguiente resultado:

 2011-01-08 23:40:18.910 Reminders[54647:207] willChangeContent 2011-01-08 23:40:18.912 Reminders[54647:207] didChangeObject 2011-01-08 23:40:18.914 Reminders[54647:207] didChangeContent 2011-01-08 23:40:18.915 Reminders[54647:207] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1145.66/UITableView.m:825 2011-01-08 23:40:18.917 Reminders[54647:207] Serious application error. Exception was caught during Core Data change processing: Invalid update: invalid number of sections. The number of sections contained in the table view after the update (5) must be equal to the number of sections contained in the table view before the update (6), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null) 

Como puede ver, "willChangeContent", "didChangeObject" (mover el object en cuestión) y "didChangeContent" se llamaron correctamente. Según la documentation de la NSFetchedResultsControllerDelegate de Apple, "didChangeSection" debería haberse llamado antes "didChangeObject", lo que habría evitado la exception que causó el locking.

Entonces, supongo que la pregunta es ¿cómo puedo asegurar que didChangeSection se llame?

¡Gracias de antemano por cualquier ayuda!

Este problema se debió al uso de un atributo transitorio como sectionNameKeyPath. Cuando almacené el atributo utilizado para sectionNameKeyPath en la database, el problema desapareció. No sé si hay una manera de actualizar las secciones en function de los cambios de contenido de NSFetchedResultsController cuando se utiliza un atributo transitorio como sectionNameKeyPath. Por ahora, estoy considerando esto como una limitación de los attributes transitorios.

Estoy haciendo lo mismo en mi aplicación (propiedad transitoria en sectionNameKeyPath) y no veo el problema que está experimentando. Estoy probando esto en iOS 4.2.1 … Hay un error conocido en el que no puedes confiar en ninguna de las devoluciones de llamada de delegado de FRC en iOS 3.X, debes hacer un [tableView reloadData] completo en el post controllerDidChangeContent: post. consulte la documentation de FRC

He probado pasando de una sección existente con otra input en ella a una sección inexistente, así como de una sección con una sola fila a otra sección inexistente.