KVO如何观察其属性的属性变化-多重属性的变化

  • 例如人类有个宠物宠物改名字时,人这个对象如何知道。
    _person = [Person new];
    _person.pet = [Pet new];

错误的方式

  • 监听 添加键值观察者到_person上 观察pet变化

    [_person addObserver:self forKeyPath:@"pet" options:NSKeyValueObservingOptionNew context:nil];

  • 回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    NSLog(@"keypatch -- %@",_person.pet.name);
}
  • 此时 _person.pet.name 的改变 是观察不到的;
    正确方式
  • 我们需要告诉系统官场的是person对象的pet的哪个属性

 [_person addObserver:self forKeyPath:@"pet.name" options:NSKeyValueObservingOptionNew context:nil];

问题来了,我们要观察person 中pet的很多属性是不是要添加很多个addObserver....方法?

  • 当然不是,我们可以使用另一种方法
#import "Person.h"

@implementation Person
//依赖关系
+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key{
    
    NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
    if ([key isEqualToString:@"pet"]) {
        keyPaths = [keyPaths setByAddingObjectsFromArray:@[@"_pet.name",@"_pet.age",@"_pet.weight"]];
    }
    
    return keyPaths;
    
}

@end

  • 这样就可以同时观察多重属性了。
    上Demo Demo

你可能感兴趣的:(KVO如何观察其属性的属性变化-多重属性的变化)