iOS-KVO

1.使用和基本方法介绍

  • 全称:Key Value Observing(键值监听)
  • 步骤:
1. 添加观察者
     /** addObserver
     *  为对象p添加一个观察者(监听器)
     *
     *  @param Observer 观察者(监听器)
     *  @param KeyPath  属性名(需要监听哪个属性)
     *  @param options  改变的值
     *  @param context 当初addObserver时的context参数值
     */

[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];

2.移除观察者(不确定什么时候该移除,就在代理对象的dealloc方法中移除)

 [p removeObserver:self forKeyPath:@"name"];


3.监听变化
/** observeValueForKeyPath
 *  当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个
 *
 *  @param keyPath 哪个属性被改了
 *  @param object  哪个对象的属性被改了
 *  @param change  改成咋样
 *  @param context 当初addObserver时的context参数值
 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
}

2. 使用示例

- (void)viewDidLoad{
  [super viewDidLoad];

//    /** 通过KVO监听 */
  for(FZQWine* wine in self.wine){
     [wine addObserver:self forKeyPath:@"amount" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
  }
}



/** KVO监视数量变化 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(FZQWine*)wine change:(NSDictionary *)change context:(void *)context
{
    /** 取出数值 */
    int oldAmount = [change[NSKeyValueChangeOldKey] intValue];
    int newAmount = [change[NSKeyValueChangeNewKey] intValue];

    /** 加入购物车或移出购物车 */
    [self changeCart:wine];

    /** 根据变化计算总价 */
    NSString *shop;
    //判断改变情况
    if (newAmount>oldAmount) {
        shop = @"plus";
    }else{
        shop = @"minus";
    }
    [self totalPriceCal:wine change:shop];
}

- (void)dealloc {
  // 移除监听
  for(FZQWine* wine in self.wine)
    {
        [wine removeObserver:self forKeyPath:@"amount"];
    }
}

3. KVO模式-自动通知和手动通知

cocoa的KVO模型中,有两种通知观察者的方式,自动通知和手动通知。顾名思义,自动通知由cocoa在属性值变化时自动通知观察者,而手动通知需要在值变化时调用 willChangeValueForKey:和didChangeValueForKey: 方法通知调用者。为求简便,我们一般使用自动通知。

4. 其他参考资料

  • 自定义实现KVO
  • Key-Value Observing机制(KVO)

你可能感兴趣的:(iOS-KVO)