objective-c key-value-observing

objective c - Observación del valor clave: ¿cómo observar todas las propiedades de un objeto?



objective-c key-value-observing (1)

Estoy contento con el uso de Key Value Observing (KVO), y cómo registrarme para recibir notificaciones de cambio de propiedad:

[account addObserver:inspector forKeyPath:@"openingBalance" options:NSKeyValueObservingOptionNew context:NULL];

Sin embargo, si quiero observar cambios en todas las propiedades del objeto de cuenta, ¿cómo puedo lograr esto? ¿Tengo que registrarme para recibir notificaciones de cada propiedad?


Parece que no hay una función incorporada para suscribirse a los cambios en todas las propiedades de los objetos.

Si no le importa qué propiedad exacta ha cambiado y puede cambiar su clase, puede agregarle una propiedad ficticia para observar los cambios en otras propiedades (utilizando el + keyPathsForValuesAffectingValueForKey o +keyPathsForValuesAffecting<Key> ):

// .h. We don''t care about the value of this property, it will be used only for KVO forwarding @property (nonatomic) int dummy; #import <objc/runtime.h> //.m + (NSSet*) keyPathsForValuesAffectingDummy{ NSMutableSet *result = [NSMutableSet set]; unsigned int count; objc_property_t *props = class_copyPropertyList([self class], &count); for (int i = 0; i < count; ++i){ const char *propName = property_getName(props[i]); // Make sure "dummy" property does not affect itself if (strcmp(propName, "dummy")) [result addObject:[NSString stringWithUTF8String:propName]]; } free(props); return result; }

Ahora, si observa una propiedad dummy , recibirá una notificación KVO cada vez que se modifique alguna de las propiedades del objeto.

También puede obtener una lista de todas las propiedades en el objeto como en el código publicado y suscribirse para recibir notificaciones de KVO para cada una de ellas en un bucle (para que no tenga que codificar los valores de las propiedades del código). De esta manera, obtendrá propiedades modificadas. Nombre si lo necesitas.