Pregunta

Tengo un NSManagedObjectContext en el que tengo un número de subclases de NSManagedObjects tales que algunos son contenedores para otros. Lo que me gustaría hacer es mirar un objeto de nivel superior para ser notificado de cualquier cambio a cualquiera de sus propiedades, asociaciones, o las propiedades / asociaciones de cualquiera de los objetos que contiene.

El uso de 'hasChanges' del contexto no me da suficiente granularidad. método de los objetos isUpdated 'sólo se aplica al objeto dado (y no cualquier cosa en sus asociaciones). ¿Hay un cómodo (tal vez, basada en MVA) era yo puedo observar los cambios en un contexto que se limitan a un subgrafo?

¿Fue útil?

Solución

Usted tendrá que escuchar el NSManagedObjectContextObjectsDidChangeNotification para recoger todos los cambios en el modelo de datos. Esto se puede hacer utilizando un código como el siguiente:

[[NSNotificationCenter defaultCenter] 
      addObserver:self 
         selector:@selector(handleDataModelChange:) 
             name:NSManagedObjectContextObjectsDidChangeNotification 
           object:myManagedObjectContext];

, lo que disparará -handleDataModelChange: sobre cualquier cambio en el contexto myManagedObjectContext.

Su -handleModelDataChange: método podría ser algo como esto:

- (void)handleDataModelChange:(NSNotification *)note
{
    NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
    NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
    NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];

    // Do something in response to this
}

Como se puede ver, la notificación contiene información en la que gestionan los objetos se actualizan, borrar e insertar. A partir de esa información, usted debe ser capaz de actuar en respuesta a los cambios en el modelo de datos.

Otros consejos

Este es un ejemplo simple en Swift:

    NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: nil, queue: nil) { note in
        if let updated = note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>, updated.count > 0 {
            print("updated: \(updated)")
        }

        if let deleted = note.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject>, deleted.count > 0 {
            print("deleted: \(deleted)")
        }

        if let inserted = note.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject>, inserted.count > 0 {
            print("inserted: \(inserted)")
        }
    }

para mí es sólo perdió dos siguientes func, tal vez esto ahorra horas para alguien

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top