iphone - resueltos - teoria de grafos ejemplos
¿Cómo puedo seguir/observar todos los cambios dentro de un subgrafo? (3)
Tengo un NSManagedObjectContext en el que tengo varias subclases de NSManagedObjects, de modo que algunos son contenedores para otros. Lo que me gustaría hacer es mirar un objeto de nivel superior para recibir notificaciones de cualquier cambio en cualquiera de sus propiedades, asociaciones o propiedades / asociaciones de cualquiera de los objetos que contiene.
Usar el contexto ''hasChanges'' no me da la suficiente granularidad. El método de objetos ''actualizado'' solo se aplica al objeto dado (y no a nada en sus asociaciones). ¿Existe una conveniente (quizás basada en KVO) en la que puedo observar los cambios en un contexto que se limitan a un subgráfico?
aquí hay 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í solo se pierde después de dos funciones, tal vez esto ahorra horas para alguien
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
Deberá escuchar NSManagedObjectContextObjectsDidChangeNotification
para recoger todos los cambios en su modelo de datos. Esto se puede hacer usando un código como el siguiente:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
que activará -handleDataModelChange:
en cualquier cambio en el contexto myManagedObjectContext
.
Su método -handleModelDataChange
se vería así:
- (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 puede ver, la notificación contiene información sobre qué objetos gestionados se actualizaron, eliminaron e insertaron. A partir de esa información, debe poder actuar en respuesta a los cambios en su modelo de datos.