KVO 键值观察者
KVO (key-value-Observer)键值观察者
通过key 来观察value的变化,去做出响应。
KVO 主要应用视图交互方面,比如界面的某些数据变化了 界面的显示也跟着需要变化,拿就要建立数据与界面之间的关系。
KVO 是一对一的传值。
通过key来监测 值是否发生改变,如果发生改变,就会自动调用KVO响应方法。
实例如下:
自定义两个类(Person、Dog)
daHuiLiang.face = @"smile";
// 使用的是KVC的知识
[daHuiLiang setValue:@"耷拢着的" forKey: @"weiBa"];
Person *liBai = [[Person alloc]init];
[liBai wacthDog:daHuiLiang];
daHuiLiang.face =@"wang!wang!wang!";
// 使用的是KVC的知识
[daHuiLiang setValue:@"摇着尾巴!" forKey: @"weiBa"];
在Person.m中写当“weiBa”这个属性发生改变时,自动调用的方法
- (void)wacthDog : (Dog *) dog{
// 观察狗的表情
wachDog = dog;
[wachDog addObserver:self forKeyPath:@"face" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
[wachDog addObserver:self forKeyPath:@"weiBa" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
//狗的新旧表情发生改变 会自动调用这个方法
//keyPath 来判断是不是咱们观察的key对应的值 发生改变
//change 是一个字典 字典里面放了 新旧属性值的内容
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
// isEqualToString 判断与 keyPath的值 是否一样
if ([keyPath isEqualToString:@"face"]) {
NSLog(@"狗的表情由%@变成%@", change[@"old"], change[@"new"]);
[self shutdown];
}
if ([keyPath isEqualToString:@"weiBa"]) {
NSLog(@"狗的尾巴由 %@ 变成 %@", change[@"old"], change[@"new"]);
[self daShang];
}
}
- (void)shutdown{
NSLog(@"打死~~~~");
}
- (void)daShang{
NSLog(@"赏你的~~~");
}
在Person.m中移除观察者
- (void)dealloc{
[wachDog removeObserver:self forKeyPath:@"weiBa"];