KVO 键值观察者

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"];  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值