- 例如人类有个宠物宠物改名字时,人这个对象如何知道。
_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<NSKeyValueChangeKey,id> *)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<NSString *> *)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