ios - Se necesitan aclaraciones para NSFetchedResultsController y NSFetchedResultsControllerDelegate
uitableview core-data (1)
¿Está implementando los métodos NSFetchedResultsControllerDelegate
para eliminar la celda?
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
Dentro de SO hay muchas preguntas / respuestas sobre NSFetchedResultsController
y delegar. A veces el delegado dispara, a veces no. Y dado que Core Data es un argumento bastante complejo, es bastante difícil entender lo que está sucediendo sin pasar mucho tiempo con él. Además, la documentación dice que hay varios problemas pero no los enumera.
Hay varios problemas conocidos y cambios de comportamiento con NSFetchedResultsController en varias versiones de iOS.
Por lo tanto, necesito algunas aclaraciones sobre el comportamiento de dicha clase. En particular, de la documentación se escribe lo siguiente:
Por lo tanto, un controlador tiene efectivamente tres modos de operación, determinados por si tiene un delegado y si está establecido el nombre del archivo de caché.
Sin seguimiento: el delegado se establece en cero. El controlador simplemente proporciona acceso a los datos tal como estaban cuando se ejecutó la búsqueda.
Seguimiento de solo memoria: el delegado no es nulo y el nombre de la memoria caché de archivos se establece en nil. El controlador monitorea objetos en su conjunto de resultados y sección de actualizaciones e información de pedidos en respuesta a cambios relevantes.
Seguimiento persistente completo: el delegado y el nombre de la memoria caché de archivos no son nada. El controlador monitorea objetos en su conjunto de resultados y sección de actualizaciones e información de pedidos en respuesta a cambios relevantes. El controlador mantiene un caché persistente de los resultados de su cálculo.
Estoy desarrollando una aplicación bastante compleja y estoy aprovechando NSFetchedResultsController
para recuperar datos de una tienda y mostrarlos en una tabla. Los objetos gestionados mostrados tienen una variable booleana syncStatus
para verificar si se han sincronizado con un servicio externo o no. syncStatus
variable syncStatus
no se muestra en una celda, se muestran diferentes informaciones (por ejemplo, valores de texto). En otras palabras, syncStatus
no se syncStatus
como error.
En la tabla, mediante NSFetchedResultsController
, NSFetchedResultsController
los únicos elementos que no están sincronizados (el valor de bool está establecido en NO
).
- (NSFetchedResultsController*)fetchedResultsController
{
if(_fetchedResultsController)
return _fetchedResultsController;
NSManagedObjectContext* mainContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"LocalEntity" inManagedObjectContext:mainContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"syncStatus == %@", [NSNumber numberWithBool:NO]]];
[fetchRequest setFetchBatchSize:10];
// sort descriptor here...
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
El usuario puede seleccionar los elementos que desea sincronizar y un hilo de fondo envía los elementos seleccionados al servicio y, para esos, también cambia la variable syncStatus
a YES
.
Cuando la operación finaliza, desde que establecí NSFecthedResultsControllerDelegate
y me registro para NSManagedObjectContextDidSaveNotification
( también NSManagedObjectContextDidSaveNotification
en el hilo principal los cambios a través de la notificación. Puedo ver que la notificación contiene objetos con el cambio correcto ), espero que el la tabla se actualiza (los objetos con syncStatus
establecido en YES
no se mostrarán).
Dicho esto, la pregunta es la siguiente.
De acuerdo con el documento, dado que uso la opción de seguimiento solo de memoria , ¿la actualización faltante se debe al hecho de que isSyncStatus
no está cargado en la memoria, pero sigue siendo un error?
¿Podrías sugerirme en la dirección correcta?
Gracias de antemano.
PD
NSFetchedResultsControllerDelegate
métodos NSFetchedResultsControllerDelegate
se implementan correctamente. Hacer lo mismo solo en el hilo principal funciona.