10

estoy escribiendo mi primera aplicación completa usando datos básicos, y que quieren ver cuál es la mejor manera de realizar un seguimiento de varios objeto cambia/actualizaciones/borra es. Por ejemplo, tengo una entidad de Notes y una entidad de ubicación, y una relación de uno a uno entre ellos, con la idea de que cada nota tenga su ubicación etiquetada. Luego tengo una UITableView con un fetchedResultsController que maneja la lista de notas (donde puedes agregar nuevas notas y adjuntarles una fecha y ubicación), pero luego tengo otras 2 controladoras de vistas, una con una vista de mapa y otra con una vista de calendario . La vista de mapa recupera todas las ubicaciones en Ubicación y las muestra en un mapa. La vista de calendario básicamente recupera todos los datos de Notes y solo los muestra en una vista de calendario. ¿Cómo debo hacer un seguimiento de los cambios en Notas y Ubicación en mi calendario y vista de mapa? Es fácil cargarlos una vez en viewDidLoad, pero ¿cómo debo realizar un seguimiento de todos los cambios, de modo que cuando el usuario vuelva a visitar la vista de mapa (por ejemplo) también vea los últimos datos?mejores prácticas - NSManagedObjectContextObjectsDidChangeNotification en IOS

La única manera que he descifrado es escuchar las notificaciones en NSManagedObjectContextObjectsDidChangeNotification, tanto en la vista de mapas como en la de calendario. Esto parece devolver todos los objetos insertados, eliminados y actualizados de un contexto administrado, cada vez que hay un guardado. Podría revisar estos objetos y ver si necesito actualizar mi vista. Esta es la forma en que estoy pensando en hacerlo:

En MapViewController viewDidLoad:

[[NSNotificationCenter defaultCenter] 
    addObserver: self 
    selector: @selector(objectChangedNotificationReceived:) 
    name: NSManagedObjectContextObjectsDidChangeNotification 
    object: context]; 

continuación:

- (void) objectChangedNotificationReceived: (NSNotification *) notification 
{ 
    NSArray* insertedObjects = [[notification userInfo] 
           objectForKey:NSInsertedObjectsKey] ; 
    NSArray* deletedObjects = [[notification userInfo] 
           objectForKey:NSDeletedObjectsKey] ; 
    NSArray* updatedObjects = [[notification userInfo] 
           objectForKey:NSUpdatedObjectsKey] ; 
    NSLog(@"insertObjects: %@", [insertedObjects description]); 
    NSLog(@"deletedObjects: %@", [deletedObjects description]); 
    NSLog(@"updatedObjects: %@", [updatedObjects description]); 

    for (NSManagedObject *obj in insertedObjects) { 
     if ([obj class] == [Location class]) { 
      NSLog(@"adding a new location"); 
      Location *locationObj = (Location *) obj; 
      [self.mapview addAnnotation: locationObj]; 
     } 
    } 
} 

que sí parece esto de verdad? Parece que hay muchos códigos redundantes para poner en cada controlador de vista, especialmente si estoy interesado en más de un NSManagedObject. ¿Hay alguna otra técnica que me falta?

Respuesta

3

NSFetchedResultsController parece ajustarse a su requisito. Manejará de manera eficiente el manejo de datos de los Datos Básicos. Reutiliza la misma solicitud de búsqueda para su controlador de vista de calendario y controlador de vista de mapa.

+0

Terminé utilizando NSFetchedResultsController, aunque mis vistas no tenían una tabla vista asociada, ¡y funciona como un amuleto! –

+0

@ZS Obviamente, 'NSFetchedResultsController' NO debe estar relacionado con tableView. –

2

Por qué no puede usted acaba de obtener los últimos datos directamente desde CoreData en el método viewWillLoad o viewDidLoad. Esto asegurará que tengas los últimos objetos.

Parece que sería más modular y más limpio.

+1

Demasiada sobrecarga. Crear un FRC que escuche los cambios para usted es el camino a seguir. –