美文网首页
iOS --- KVO

iOS --- KVO

作者: BabyNeedCare | 来源:发表于2019-06-24 11:24 被阅读0次

    KVO 的底层实现原理

    (1)KVO 是基于 runtime 机制实现的

    (2)假如有个对象DoLin(类型为Dog), 其属性name发生变化时,系统会自动生成一个继承Dog的类,NSKVONotifying_类名,次例为NSKVONotifying_Dog, 在这个类的setName方法中调用3个方法:

     [super setName:name]; 

    [self willChangeValueForKey:@"name"]; 

    [self didChangeValueForKey:@"name"]; 

    后面两个方法内部会主动调用;

    (3)方法回调

    -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context;

    根据此方法的返回做UI刷新等操作。

     KVO的作用:

    - (void)viewDidLoad {

        [super viewDidLoad];

        Dog*d1 = [[Dogalloc]init];

        d1.name  =@"DoLin";

    [d1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"123"];//@"123"是随意写入的,如果很多不同的模型需要用到KVO, 可写入不同值用于区分,否则,写nil即可。

    }

    /**

    *  利用KVO 监听到对象属性值改变后,就会调用这个方法

    *

    *  @param keyPath 哪一个属性被改了

    *  @param object  哪一个对象的属性被改了

    *  @param change  改成什么样了

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

    // NSKeyValueChangeNewKey == @"new"

    NSString*new = change[NSKeyValueChangeNewKey];

    // NSKeyValueChangeOldKey == @"old"

    NSString*old = change[NSKeyValueChangeOldKey];NSLog(@"%@-%@",new,old);}

    相关文章

      网友评论

          本文标题:iOS --- KVO

          本文链接:https://www.haomeiwen.com/subject/zujnqctx.html