KVO: key value observing

/**

 *   KVO: key value observing

 观察者模式,和通知中心类似.

 当指定对象的属性发生变化时,对象就会收通知,

 使用:

 1.添加观察者

 2.使用回调方法

 3.触发回调方法.

 4.移除观察者.

 */

 //1.注册观察者

    /**

     *addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil

     参数1:观察者对象

     参数2:被观察者的属性

     参数3:选项设置

           Old 获取变化之前的旧值;

           New 获取变化之后的新值;

           Initial 即使赋值操作,添加观察者之后,仍会触发一次观察者的方法.

          Prior 每次属性发生变化,会触发两次,变化之前和变化之后各触发一次.变化之前的字典中会有一个notificationIsPrior键值对,变化之后没有该键值对.

     参数4:可用于传值.

     */

    [self.aMovie addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];

 

  #pragma mark -KVO 自动回调方法-

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    //change 中的kind有1,2,3,4.  1针对赋值,2,3,4针对集合类(数组,字典,集合)的插入,删除,替换,

    //一个被观察者可以添加多个观察属性,可通过keyPath做以区分.

    if ([keyPath isEqualToString:@"title"]) {

        NSLog(@"%@",change[NSKeyValueChangeNewKey]);

    }else if ([keyPath isEqualToString:@"type"]){

           NSLog(@"%@",change);

    }

}

//当不需要使用观察者时  移除观察者.

-(void)dealloc{

    [self.aMovie removeObserver:self forKeyPath:@"title"];

    [self.aMovie removeObserver:self forKeyPath:@"content"];

}

 

posted @ 2016-10-29 14:13  Comder  阅读(106)  评论(0编辑  收藏  举报