在查资料了解runtime的时候,基本上都会读到一个词,KVO,即 Key-Value-Obseving,我称它为键值对观察者模式。它提供一种机制,当制定的key对应的value值添加了观察者之后,如果该key对应的value值被更改,就会收到键值被修改的通知。通过这个方法,我们可以随时监听应用中某个字段的改变,随着这个改变进行其他逻辑的更改。
对于KVO的使用,使用方法分为三步:
1.为某个字段注册观察者
2.实现观察者改变的回调
3.撤销观察者
首先我们看注册观察者的代码实现,我们需要创建一个实体类Student
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,strong) NSString * name;
@property (nonatomic,assign) NSInteger point;
@end
然后实例化这个对象,并对该对象的两个属性进行赋值操作,然后分别对两个属性进行观察者注册
student = [[Student alloc] init];
student.name = @"name";
student.point = 0;
[student addObserver:self forKeyPath:@"point" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
[student addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
注 :这里的self是引用该对象的视图控制类
在该类中实现观察者的回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"name"]) {
NSLog(@"name has change to %@",[student valueForKey:@"name"]);
}
if ([keyPath isEqualToString:@"point"]) {
NSLog(@"point has change to %@",[student valueForKey:@"point"]);
}
[label setText:[NSString stringWithFormat:@"name变更为:%@----point变更为:%@",[student valueForKey:@"name"],[student valueForKey:@"point"]]];
}
通过键值路径进行判断,是否有改变的是你所要监听的那个属性字段,接下来做你想做的逻辑处理。
最后,记得移除观察者,至于在哪里进行移除 我的习惯是在界面消失的时候进行移除
代码如下:
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[student removeObserver:self forKeyPath:@"point" context:nil];
[student removeObserver:self forKeyPath:@"name" context:nil];
}
这就是KVO的简单使用。
最后说一下我在哪些地方用到过这中方法吧
我在前公司做过一个德州扑克的游戏,游戏里面每个界面都基本上需要展示用户的游戏币数量,并且,随时都可能有所更改,这时候,后台会随时发送通知给我,告诉我我的筹码数量发生了改变,我就要随时监听变化然后进行各种界面的更新展示,并且进行逻辑判断,有些页面筹码不够或者筹码没了要如何展示,后续的处理逻辑等。