iphone - incognito - NSFetchedResultsChangeUpdate activado en lugar de NSFetchedResultsChangeDelete
nfc ios 11 (3)
Hago lo mismo en mi aplicación y he notado que el -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath
delegate primero recibe una llamada con un tipo de cambio de NSFetchedResultsChangeDelete
seguido de una segunda llamada con un tipo de cambio de NSFetchedResultsChangeUpdate
.
El comportamiento esperado de NSFetchedResultsChangeUpdate
, pero lo que NSFetchedResultsChangeDelete
se NSFetchedResultsChangeDelete
es por NSFetchedResultsChangeDelete
falta la primera llamada con NSFetchedResultsChangeDelete
. ¿Puedes confirmar que estás manejando este caso correctamente?
Tengo un NSFetchedResultsController iniciado de la siguiente manera:
NSEntityDescription *myEntity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:myEntity];
[fetchRequest setFetchBatchSize:10];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor, nil]];
myFetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
myFetchedResults.delegate = self;
[myFetchedResults performFetch:nil];
Algunos hechos:
wasDeleted es una propiedad NSNumber (BOOL) de MyEntity
Si actualizo esta propiedad a
[NSNumber numberWithBool:YES]
NSFetchedResultsControllerDelegate llama a didChangeObject pero activa NSFetchedResultsChangeUpdate en lugar de NSFetchedResultsChangeDelete .Sin embargo, si abro la vista e inicio de nuevo el controlador de resultados obtenidos, el objeto ya no está, mostrando que
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];
trabajos.Después de este NSFetchedResultsChangeUpdate, cuando se llama a cellForRow, imprimo wasDeleted y está establecido en YES.
¿Qué puede estar mal aquí?
(En otras palabras, NSFetchedResultsChangeDelete se puede llamar si el objeto todavía existe en el contexto pero no se ajusta al predicado?)
Por supuesto, changeUpdate
y no changeDelete
. Solo actualizó un valor y no eliminó el ítem completo. Si elimina el elemento de su base de datos, llamará a changeDelete
. Y no se muestra después de la nueva inicialización porque la tabla está filtrando en función de este atributo.
Tendrá que escuchar NSFetchedResultsChangeUpdate
y verificar si el atributo wasDeleted
ha cambiado. Si es así, actualice su vista de tabla a sus necesidades, ej. eliminar la fila específica.
Tuve exactamente el mismo problema que tú.
No use wasDeleted
como el nombre de su propiedad. No debe usar variaciones de deleted
al tratar con sus objetos CoreData.
Cambié el nombre de mi propiedad a hidden
, y lo usé para el predicado. Todo funcionó como era de esperar.