KVO(Key-Value-Observer)的基本概念和用法

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 *)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 *)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

你可能感兴趣的:(KVO(Key-Value-Observer)的基本概念和用法)