NSFetchedResultsController no muestra actualizaciones de un contexto diferente
Yo tengo unNSFetchedResultsController
y algunas operaciones actualizan los objetos gestionados en hilos separados a través deNSOperationQueue
.
El FRC (con su predicado) se ve así:
<code>- (NSFetchedResultsController*)fetchedResultsController { if(fetchedResultsController) return fetchedResultsController; NSManagedObjectContext* mainContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]]; [fetchRequest setFetchBatchSize:10]; fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil]; fetchedResultsController.delegate = self; [fetchRequest release], fetchRequest = nil; return fetchedResultsController; } </code>
El subproceso principal y la operación de subproceso tienen sus propios contextos de objeto administrado. Solo comparten el mismo coordinador.
Dentro de la operación roscada cambio elisSync
propiedad deNO
aYES
. Para saber que esCheck
entidad a actualizar, el contexto principal pasa al subproceso unNSManagedObjectID
. La operación de subproceso recupera el objeto gestionado como el siguiente:
<code>-(void)main { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init]; [exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]]; //... Check* check = (Check*)[exportContext existingObjectWithID:objID error:&error]; check.isSync = [NSNumber numberWithBool:YES]; //... [exportContext save:&error]; [pool release], pool = nil; } </code>
Cuando la operación de hilo llama asave
lamergeChangesFromContextDidSaveNotification
Se llama a la notificación y el contexto principal fusiona los cambios.
<code>- (void)contextChanged:(NSNotification*)notification { if ([notification object] == [self managedObjectContext]) return; if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES]; return; } [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification]; } </code>
Registrando la descripción de lanotification
lleva a verificar que los cambios se realizan correctamente.
Mi problema
Delegados métodos deNSFetchedResultsControllerDelegate
no son llamados
Esto es bastante extraño ya que tratar con el mismo contexto, el principal, permite escuchar los cambios y llamar a los métodos de los delegados, por ejemplo. borrando un objeto de fila en elUITableView
.
He encontrado algunos temas sobre SO con el mismo problema. He intentado todas las soluciones alternativas pero no puedo encontrar una solución valiosa:
NSFetchedResultsController no muestra actualizaciones de otros contextos
Gracias de antemano.
Editar
El código de arriba estaba trabajando en un modelo anterior. Luego creé un nuevo modelo copiando (y pegando) entidades del anterior y ahora ya no funciona.
Sugerencias?
Editar 2
Este es el predicado que estoy usando enNSFetchedResultsController
adquiridor. Es mi culpa, pero cuando escribí el post no lo copié.
<code>NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; // previous code here [fetchRequest setSortDescriptors:sortDescriptors]; </code>
Ahora, sobreJody último comentario
En la parte principal () de su NSOperation, está cargando nuevos objetos, y allí parece que está configurando isSync en SÍ para cada nuevo objeto. El predicado que usa para el comando fetchedResultsController solo busca los objetos que tienen isSync == NO.
Espero que cuando la propiedadisSync
se establece en SÍ, elNSFetchedResultsController
observa que cambia y elimina las filas que no coinciden con el predicado. ¿Me equivoco?
Recuerde que cuando fusiono cambios del fondo al hilo principal, puedo ver que pocos objetos han actualizado suisSync
propiedad.