objective-c(七)关于KVO模式

  在objective-c中,关于数据的使用,有一种框架内置的技术来使用回调通知的技术,叫做KVO技术。

  这个技术主要针对于某个对象的值改变后所进行的后续处理。

  首先要实现该技术首先要开始监听某个对象的字段。监听一般在对象的初始化方法中。

  [self addObserver:self forKeyPath:@"sub" options:NSKeyValueObservingOptionNew context:nil];

  在init方法中,调用自身的addObserver方法,并且将想要监听的字段以字符常量的形式给入,在options中可以选择回调的时候接收的值。至于context的值可以暂时不通考虑

  之后在对象名实现回调的方法。

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

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

           NSLog(@"我回调了啊:%@", [change objectForKey:@"new"]);

        }

  }

  如上:就是一个简单的回调方式。在change的值中,@"new"字段为选择返回的字段。该字段对应的时添加监听时options字段的值。

  之后只要对象在使用时。某个值进行的变化就可对相应的变化进行某些操作;

  还有就是不能忘记在dealloc方法中将监听对象移除

  -(void) dealloc{

      [self removeObserver:self forKeyPath:@"sName"];

  }

  以上时自动的KVO模式。

  还有手动的KVO模式。监听和回调的方法不变。需要的是

  +(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{

      NSLog(@"look:%@",key);

      if([key isEqualToString:@"sName"]){

          NSLog(@"手动");

          return NO;

      }else{

          NSLog(@"自动");

          return YES;

      }

  }

  只需要重写该方法。返回no就是手动回到,如果是yes就是自动,当为手动时,字段值改变需要在改变前后调用这两个方法来告诉框架需要补货回调。

  [self willChangeValueForKey:@"sName"];

  [self setSName:@"todd"];

  [self didChangeValueForKey:@"sName"];

  以上的代码是在对象方法中改变值,如果在一些action或者main方法中改变值,可以在类中设置两个方法。分别是将要改变和改变完成。回调方法调用的是一个方法。但是必须让这两个方法包围值改变代码。

 

 

原文地址:https://www.cnblogs.com/imtodd/p/6667833.html