7

Mi programa funciona como enlace de abajo:¿NSFetchedResultsController observa todos los cambios en la tienda permanente?

Update results of NSFetchedResultsController without a new fetch

  1. espectáculo resultado de NSFetchedResultsController a UITableView
  2. obtener nuevo objeto de servicio web y almacenarlo a datos básicos (en el mismo controlador de vista, con RestKit)
  3. actualización de vista de tabla con la notificación de NSFetchedResultsController delegado

La implementación de NSFetchedResultsControllerDelegate se copia de proyecto de Datos Básicos de Apple y mi predican es:

[NSPredicate predicateWithFormat:@"isMyTest == TRUE"] 

Si la actualización propiedad pasa de TRUE a FALSE, elimina las filas de la tableview (porque el objeto de la fila está en fetchedObjects de NSFetchedResultsController)

Sin embargo, si la actualización de la propiedad va de FALSE a TRUE, NSFetchedResultsController no notifica nada, por lo que los nuevos datos no se pueden ver en la vista de tabla. Si actualizo AMBOS NSFetchedResulsController y UITableView de forma manual, muestra los datos nuevos.

Pensé que NSFetchedResultController mira todos los cambios en la tienda persistente, ¿es una gran esperanza? : D

(. Realmente quiero hacer eso porque otro controlador de vista puede actualizar almacén persistente, entonces es difícil para actualizar el controlador de vista)

Si es así, puede que me haga saber cómo puedo actualizar NSFetchedResultsController de manera hermosa?

(actualización)

en referencia de NSfetchedResultsController, leí las palabras siguientes:

Un controlador así efectivamente tiene tres modos de funcionamiento, determinado por el hecho de que tiene un delegado y si el archivo de caché nombre está establecido.

Sin seguimiento: el delegado se establece en nil. El controlador simplemente proporciona acceso a los datos tal como estaban cuando se ejecutó la búsqueda.

Seguimiento solo de memoria: el delegado no es nulo y el nombre de la memoria caché se establece en nil. El controlador supervisa los objetos en su conjunto de resultados y la sección de actualizaciones y la información de pedido en respuesta a los cambios relevantes .

Seguimiento persistente completo: el delegado y el nombre de la memoria caché de archivos son no-nil. El controlador supervisa los objetos en su conjunto de resultados y actualiza la sección y la información de pedido en respuesta a los cambios relevantes. El controlador mantiene un caché persistente de los resultados de su cálculo .

"Seguimiento completo persistente" no significa lo que quiero? Configuré cacheName, pero funciona igual.

Respuesta

5

Pensé que NSFetchedResultController mira todos los cambios en la tienda persistente , ¿es demasiado grande la esperanza?

El FRC solo observa automáticamente los objetos devueltos por su recuperación. Esto normalmente no es un problema, ya que los cambios a los objetos monitoreados por un FRC deberían surgir de la interfaz de usuario de la tabla de visión o de un contexto de fondo. En el primero, se avisa al FRC sobre el cambio y, en este último, al fusionar el contexto de primer plano y fondo se activará el FRC para su actualización.

Parece que tiene valores de cambio de código pero no notifica al FRC que ha realizado cambios. (. Si tienes un tableview que muestra todos los objetos cuya isMyTest == TRUE entonces, evidentemente, no se puede acceder a los objetos de la interfaz de usuario cuya isMyTest == FALSE) En ese caso, es necesario registrar el controlador para tableview:

NSManagedObjectContextObjectsDidChangeNotification 

... notificaciones del contexto para que pueda decirle al FRC que actualice los cambios realizados fuera de su observación.

+0

Muchas gracias por su respuesta y edición de mi pregunta, pero encontré que CoreData HACE el seguimiento completo del repositorio "con pruebas al hacer un nuevo proyecto de prueba. – moon6pence

+0

Estoy depurando mi proyecto si hay un error. – moon6pence

0

Lamento mi error, lo probé con un nuevo proyecto de prueba.

CoreData realiza el seguimiento completo de la tienda persistente completa.

Esto significa que, si el objeto nuevo es adecuado para el predicado de NSFetchedResultsController, el delegado lo notificará.

+1

No, el contexto notifica al FRC porque el FRC se ha registrado en el contexto para recibir notificaciones de inserción, actualización y eliminación. Si realiza un cambio desconocido para el contexto del FRC, no lo hará. Por ejemplo, un contexto en otro subproceso realiza un cambio que no se fusiona con el contexto de la FRC. La FRC está rastreando el contexto NO la tienda persistente. – TechZen

+0

Ah, thx. Se refiere a cambios en la tienda NO persistente, pero en el contexto de datos ENTERO, lo obtuve. – moon6pence

+0

Mi problema era el cambio del objeto no en el resultado de FRC, no se notifica a delegar. – moon6pence

Cuestiones relacionadas