Наблюдение за ключевым значением - как наблюдать все свойства объекта?

Я доволен использованием Key Value Observing (KVO) и как зарегистрироваться для получения уведомлений об изменении свойства:

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

Однако, если я хочу наблюдать изменения во всех свойствах объекта учетной записи, как я могу это сделать? Должен ли я регистрироваться для уведомления о каждом свойстве?

Ответ 1

Кажется, нет встроенной функции для подписки на изменения во всех свойствах объектов.

Если вам не важно, какое именно свойство изменилось и может изменить ваш класс, вы можете добавить к нему свойство фиктивного поведения, чтобы наблюдать изменения других свойств (используя метод + keyPathsForValuesAffectingValueForKey или +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;
}

Теперь, если вы наблюдаете свойство dummy, вы получите уведомление KVO каждый раз, когда будут изменены какие-либо свойства объекта.

Также вы можете получить список всех свойств в объекте, как и в опубликованном коде, и подписаться на уведомления KVO для каждого из них в цикле (так что вам не нужны значения свойств жесткого кода) - таким образом вы будете получите измененное имя свойства, если вам это нужно.