core data - NSFetchedResultsController with predicate ignora los cambios fusionados de NSManagedObjectContext diferente
core-data nspredicate (2)
Debe llamar a processPendingChanges en su Background-NSManagedObjectContext después de fusionar los cambios desde otro NSManagedObjectContext.
Vea la Guía de programación de CoreData:
Tenga en cuenta que la notificación de cambio se envía en el método processPendingChanges de NSManagedObjectContext. El hilo principal está vinculado al ciclo de eventos de la aplicación, de modo que processPendingChanges se invoque automáticamente después de cada evento de usuario en contextos propiedad del hilo principal. Este no es el caso para los hilos de fondo: cuando se invoca el método depende tanto de la plataforma como de la versión de lanzamiento, por lo que no debe confiar en el momento específico. Si el contexto secundario no está en el hilo principal, debe llamar a processPendingChanges usted mismo en las coyunturas apropiadas.
Estoy presentando los contenidos de la vista de tabla utilizando NSFetchedResultsController
que tiene un predicado:
[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]
En el hilo de fondo usando NSManagedObjectContext
separado, actualizo algunas de las entidades y cambio su valor visible
de NO
a YES
. Guarde, NSManagedObjectContext
cambios en NSManagedObjectContext
la NSManagedObjectContext
. Pero NSFetchedResultsController
de fetchedObjects
no cambia. También el controlador no llama -controller:didChangeObject:...
en delegado. Si las entidades se actualizan en el hilo principal de la misma manera (mi aplicación de prueba llama al mismo método), todo funciona como se espera.
Además, NSUpdatedObjectsKey
de Notification contiene esos objetos.
Actualmente, las únicas soluciones que he encontrado es llamar a cada una de NSUpdatedObjectsKey
entidades NSUpdatedObjectsKey
:
NSManagedObjectContext *context = ... // main thread context
[context existingObjectWithID:[object objectID] error:nil]
Este problema es solo con objetos actualizados que anteriormente no coincidían con el predicado.
¿Me estoy perdiendo algo obvio?
Resulta que NSManagedObjectContext
principal no NSManagedObjectContext
evento NSManagedObjectContextObjectsDidChangeNotification
para los objetos actualizados porque no está hecho para los objetos con errores.
Solución genérica (o mantenga un registro de las identificaciones de objetos que necesitan este tratamiento):
NSManagedObjectContext *context = [self managedObjectContext];
for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {
[[context objectWithID:[object objectID]] willAccessValueForKey:nil];
}
[context mergeChangesFromContextDidSaveNotification:notification];
De NSManagedObject Class Reference :
Puede invocar este método con el valor clave de nil para asegurarse de que se ha disparado un fallo, como se ilustra en el siguiente ejemplo.