2012-11-21 16 views
16

Jestem zadowolony z wykorzystaniem Key Value obserwując (KVO), a jak się zarejestrować, aby otrzymywać powiadomienia o zmianie własności:Obserwacja wartości klucza - jak obserwować wszystkie właściwości obiektu?

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

Jednakże, jeśli chcę obserwować zmiany we wszystkich właściwości obiektu konta , jak mogę to osiągnąć? Czy muszę się zarejestrować w celu powiadomienia o każdej nieruchomości?

Odpowiedz

17

Wygląda na to, że nie ma wbudowanej funkcji subskrypcji zmian we wszystkich właściwościach obiektów.

Jeśli nie dbają o której dokładnie nieruchomość zmieniła i można zmienić klasę można dodać właściwość obojętne na to, aby obserwować zmiany w innych właściwościach (używając + keyPathsForValuesAffectingValueForKey lub +keyPathsForValuesAffecting<Key> metody):

// .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; 
} 

teraz jeśli zauważysz właściwość dummy, otrzymasz powiadomienie KVO za każdym razem, gdy zmieni się dowolna właściwość obiektu.

Możesz również uzyskać listę wszystkich właściwości w obiekcie, jak w zaksięgowanym kodzie i zasubskrybuj powiadomienia KVO dla każdego z nich w pętli (nie musisz więc korzystać z wartości twardego kodu) - w ten sposób " W razie potrzeby otrzymam zmienioną nazwę właściwości.

+4

To wydaje się pośrednie, ale wskazał mi właściwy kierunek. class_copyPropertyList() i property_getname() są wystarczające do dodania obserwacji do każdej właściwości, dokładnie tak, jak pierwotnie zadawano. –

+0

Czy są jakieś uaktualnienia fragmentu kodu powyżej? – fatuhoku

+0

Plus, czy to działa dla NSManagedObjects? – fatuhoku

Powiązane problemy