Sembra che non ci sia una funzione incorporata per sottoscrivere le modifiche in tutte le proprietà degli oggetti.
Se non si cura di quale esattamente proprietà è cambiato e può cambiare la tua classe è possibile aggiungere proprietà fittizio ad esso per osservare i cambiamenti in altre proprietà (utilizzando + keyPathsForValuesAffectingValueForKey
o +keyPathsForValuesAffecting<Key>
metodo):
// .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;
}
Ora se si osserva la proprietà dummy
, si riceverà la notifica KVO ogni volta che viene modificata una delle proprietà dell'oggetto.
Inoltre è possibile ottenere l'elenco di tutte le proprietà nell'oggetto come nel codice pubblicato e sottoscrivere le notifiche KVO per ognuna di esse in un ciclo (in modo da non avere valori di proprietà del codice rigido) - in questo modo si ' Riceverete il nome della proprietà cambiata se ne avete bisogno.
Questo sembra indiretto, ma mi ha indirizzato nella giusta direzione. class_copyPropertyList() e property_getname() sono sufficienti per aggiungere osservazioni su ogni proprietà, esattamente come originariamente richiesto. –
Quindi ci sono aggiornamenti allo snippet di codice sopra allora? – fatuhoku
Inoltre, funziona per NSManagedObjects? – fatuhoku