KVO Options 詳細(xì)介紹
Options 影響 方法 observeValueForKeyPath:ofObject:change:context:
中的 change
字典, 選擇不同的 Options
, 字典 change
的內(nèi)容會(huì)隨著改變
-
NSKeyValueObservingOptionOld
:change
中會(huì)包含 key 變化之前的值 old -
NSKeyValueObservingOptionNew
:change
中包含 key 變化之后的值 new -
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew
:change
中即包含 key 的舊值怔接,也包含新值 -
NSKeyValueObservingOptionInitial
:change
中不包含 key 的值,會(huì)在 kvo 注冊(cè)的時(shí)候立即發(fā)送通知。 -
NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew
: 注冊(cè)kvo時(shí)立即發(fā)送通知change
中有 new 值闰蚕,這里的 new 值是注冊(cè)之前 key 的值流译。 -
NSKeyValueObservingOptionPrior
: 會(huì)在值發(fā)生改變前發(fā)出一次通知刺覆,當(dāng)然改變后的通知依舊還會(huì)發(fā)出卖怜,也就是每次change都會(huì)有兩個(gè)通知键思。值變化之前發(fā)送通知的change
中包含一個(gè)鍵值對(duì)NSKeyValueChangeNotificationIsPriorKey:@(1)
, 值發(fā)生變化之后的的通知change
不包含上面提到的 鍵值對(duì),可以跟willChange
手動(dòng)通知搭配使用
除了存在
NSKeyValueObservingOptionInitial
會(huì)在注冊(cè) KVO 時(shí)發(fā)送通知础爬,其他選項(xiàng)都是在 key 發(fā)生變化時(shí)才發(fā)送通知。
下面驗(yàn)證一下上面的結(jié)論
注冊(cè) 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通知響應(yīng)
- (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`
注冊(cè)時(shí) 不發(fā)通知
change: {
kind = 1;
new = 10;
}
- `NSKeyValueObservingOptionOld`
注冊(cè)時(shí) 不發(fā)通知
change: {
kind = 1;
old = 111;
}
- `NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld`
注冊(cè)時(shí)不發(fā)通知
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;
}