¿Cómo puedo realizar un seguimiento de E / observar todos los cambios dentro de un subgrafo?
-
20-09-2019 - |
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?
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()
}