2012-11-21 14 views
16

Sono felice con l'uso di Key Valore Observing (KVO), e come registrarsi per ricevere notifiche di modifica della proprietà:Osservazione dei valori chiave: come osservare tutte le proprietà di un oggetto?

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

Tuttavia, se voglio osservare i cambiamenti in tutte le proprietà dell'oggetto conto , Come posso raggiungere questo obiettivo? Devo registrarmi per la notifica per ogni proprietà?

risposta

17

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.

+4

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. –

+0

Quindi ci sono aggiornamenti allo snippet di codice sopra allora? – fatuhoku

+0

Inoltre, funziona per NSManagedObjects? – fatuhoku

Problemi correlati