KVO Options 详细介绍
Options 影响 方法 observeValueForKeyPath:ofObject:change:context: 中的 change 字典, 选择不同的 Options , 字典 change的内容会随着改变
-
NSKeyValueObservingOptionOld:change中会包含 key 变化之前的值 old -
NSKeyValueObservingOptionNew:change中包含 key 变化之后的值 new -
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew:change中即包含 key 的旧值,也包含新值 -
NSKeyValueObservingOptionInitial:change中不包含 key 的值,会在 kvo 注册的时候立即发送通知。 -
NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew: 注册kvo时立即发送通知change中有 new 值,这里的 new 值是注册之前 key 的值。 -
NSKeyValueObservingOptionPrior: 会在值发生改变前发出一次通知,当然改变后的通知依旧还会发出,也就是每次change都会有两个通知。值变化之前发送通知的change中包含一个键值对NSKeyValueChangeNotificationIsPriorKey:@(1), 值发生变化之后的的通知change不包含上面提到的 键值对,可以跟willChange手动通知搭配使用
除了存在
NSKeyValueObservingOptionInitial会在注册 KVO 时发送通知,其他选项都是在 key 发生变化时才发送通知。
下面验证一下上面的结论
注册 KVO
KVO_Employees *employees = [[KVO_Employees alloc] init];
employees.salary = @(111);
[employees addObserver:self forKeyPath:@"salary" options:options context:nil];
employees.salary = @(10);
[employees removeObserver:self forKeyPath:@"salary"];
KVO通知响应
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"change: %@",change);
}
Log 打印如下
- `NSKeyValueObservingOptionInitial`
change: {
kind = 1;
}
change: {
kind = 1;
}
- `NSKeyValueObservingOptionNew`
注册时 不发通知
change: {
kind = 1;
new = 10;
}
- `NSKeyValueObservingOptionOld`
注册时 不发通知
change: {
kind = 1;
old = 111;
}
- `NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld`
注册时不发通知
change: {
kind = 1;
new = 10;
old = 111;
}
- `NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew`
change: {
kind = 1;
new = 111;
},
change: {
kind = 1;
new = 10;
},
- `NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld`
change: {
kind = 1;
new = 111;
}
change: {
kind = 1;
new = 10;
old = 111;
}
- `NSKeyValueObservingOptionPrior`
change: {
kind = 1;
notificationIsPrior = 1;
}
change: {
kind = 1;
}