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;
}