KVO(Key-Value-Observer)的基本概念和用法
1、基本概念
一種使對象獲取其他獨享的特定屬性變化的通知機制
2、適用情況
主要用于試圖,交互方面,比如界面的某些數據變化了,界面的顯示也需要跟著變化,就需要建立數據和界面的關聯
3、實現步驟
1)采用下面這個方法給屬性添加觀察者,在哪里注冊觀察者就要在哪里移除觀察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
2)觀察者實現下面方法,如果監聽的屬性發生變化,便會調用該方法。
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context;
3)個人習慣在delloc中釋放
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context;
4)下面是在一個程序里面的例子,幫大家理清思路
- (void)watchDog:(Dog *)dog{
_dog = dog;
/*
* _dog:指定觀察哪個對象
* self: 誰觀察dog
* face: 指定觀察dog對象的哪個屬性
* OptionNew | OptionOld:當屬性變化時,將新值和舊值都傳給方法
* context: 參數
*/
//1.讓主人監聽狗的表情
[_dog addObserver:self forKeyPath:@"face" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
//2.讓主人監聽狗的動作
[_dog addObserver:self forKeyPath:@"action" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
//如果監聽的屬性發生變化,便會調用該方法。
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context{
if([keyPath isEqualToString:@"face"])
{
if ([change[@"new"] isEqualToString:@"smaile"]) {
NSLog(@"狗由%@變化為%@",change[@"old"],change[@"new"]);
NSLog(@"給一塊肉");
}
}else if ([keyPath isEqualToString:@"action"]){
if ([change[@"new"] isEqualToString:@"汪汪汪"]) {
NSLog(@"狗由%@變化為%@",change[@"old"],change[@"new"]);
NSLog(@"打一頓");
}
}
}
//當主人對象被釋放后移除觀察著
- (void)dealloc{
[_dog removeObserver:self forKeyPath:@"face"];
[_dog removeObserver:self forKeyPath:@"action"];
}
@end