iOS --- KVO

2019-06-24  本文已影响0人  BabyNeedCare

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);}

上一篇下一篇

猜你喜欢

热点阅读