KVO原理
利用运行时,生成一个对象的子类,并生产子类的对象,并替换原来对象的isa指针,重写了监听属性的set方法。
KVO触发的条件
set方法调用。
KVO监听类型
NSKeyValueObservingOptionNew:返回新值
NSKeyValueObservingOptionOld:返回旧值
NSKeyValueObservingOptionInitial:在注册的时候发一次通知,在改变的时候也会发一次通知
NSKeyValueObservingOptionPrior:改变之前发一次通知,改变之后发一次通知
KVO调用方式
手动/自动(默认)。
将一个对象的KVO调用设置为手动
重写该对象的方法
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
if ([key isEqualToString:@"name"]) {
return NO;
}
return YES;
}
手动调用KVO
[self.person willChangeValueForKey:@"name"];
self.person.name = @"Jack";
[self.person didChangeValueForKey:@"name"];
KVO监听数组变化
[self.person addObserver:self forKeyPath:@"friends" options:NSKeyValueObservingOptionNew context:nil];
…
[[self.person mutableArrayValueForKey:@"friends"] addObject:@"Rose"];
KVO子级路径关联
@implementation JKRFamily
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keySet = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"person"]) {
NSSet *set = [NSSet setWithObject:@"_person.name"];
keySet = [keySet setByAddingObjectsFromSet:set];
}
return keySet;
}
@end
[self.family addObserver:self forKeyPath:@"person" options:NSKeyValueObservingOptionNew context:nil];
self.family.person.name = @"Jack";
网友评论