2009-06-15 17 views
7

Estoy trabajando en una aplicación que contiene sus datos en un servidor MySQL externo, pero lo almacena en caché localmente usando Core Data para mejores tiempos de respuesta. Básicamente, lo que me gustaría hacer es esto:Actualice los resultados de NSFetchedResultsController sin una nueva búsqueda

  1. Obtener datos de la base de datos (almacén de datos SQLite, utilizando NSFetchedResultsController) y mostrarlo
  2. agarre nuevos elementos del servidor MySQL en el fondo
  3. Actualice la vista de tabla actual con el nuevo conjunto de datos (elementos nuevos y antiguos)

Tengo todo esto funcionando, excepto el último paso. No puedo entender cómo hacer que NSFetchedResultsController actualice su conjunto de datos. Hasta ahora, he intentado añadir elementos directamente a su NSManagedObjectContext:

[NSEntityDescription insertNewObjectForEntityForName:@"Entity" 
           inManagedObjectContext:[fetchedResultsController 
                 managedObjectContext]];

También he intentado lo que hace Apple en su ejemplo CoreDataBooks, y se utiliza una "adición" contexto separada objeto gestionado y una llamada a mergeChangesFromContextDidSaveNotification:. Ninguno parece cambiar el conjunto de NSManagedObject * s actualmente en el contexto de objeto gestionado de mi controlador de resultados obtenidos.

¿Cómo podría actualizar el conjunto de objetos que gestiona actualmente NSFetchedResultsController?

Respuesta

4

Descubrí que mi problema no era que los objetos no estuvieran actualizando, sino que la instancia de NSFetchedResultsController que tenía no estaba actualizando correctamente sus títulos de índice de sección, y por lo tanto no podía ver los resultados en mi UITableView.

Actualizar un contexto de objeto gestionado desde un controlador de resultados obtenidos hace actualizar el conjunto de objetos de resultado del controlador.

7

simplemente tiene su problema y sí, al parecer el uso de notificaciones es la única forma en que puede hacer una actualización de tabla cuando la tabla utiliza un controlador nsfetchedresults.

como en la muestra de libros de datos básicos:
Paso 1: añadir un observador a la NSNotificationCenter para la NSManagedObjectContextDidSaveNotification notificación
Paso 2: guardar su contexto (la notificación de disparo a su selector)
Paso 3: en su método selector: combine los cambios en el contexto utilizando el método mergeChangesFromContextDidSaveNotification
step4: elimine el observador del centro de notificaciones.

Personalmente me gustaría pasar por alto la certer notificación, y sólo decir el contexto refrescarse maldita sea :)

+0

Este es de hecho el método que utiliza, y creo que esta es la forma en que Apple hace que en algunos de sus Ejemplos de datos básicos. – Tim

Cuestiones relacionadas