天天看点

IOS中简单的KVO概念理解与应用

在查资料了解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的简单使用。

最后说一下我在哪些地方用到过这中方法吧

我在前公司做过一个德州扑克的游戏,游戏里面每个界面都基本上需要展示用户的游戏币数量,并且,随时都可能有所更改,这时候,后台会随时发送通知给我,告诉我我的筹码数量发生了改变,我就要随时监听变化然后进行各种界面的更新展示,并且进行逻辑判断,有些页面筹码不够或者筹码没了要如何展示,后续的处理逻辑等。