首页 > 代码库 > 【OC学习-32】KVO-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果

【OC学习-32】KVO-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果

什么是KVO?

KVO应该是key-value-observer,意思就是键值观察。作用就是用一个对象A监测对象B,如果对象B属性发生变化,那么就会发送一个消息给对象A,这样……呃,就这样了。至于拿到通知后怎么处理,那是后话。


举例:创建一个Child类(初始化后开启定时器把一个happValue值从100自减1),再创建一个Nurse类,并且在这个Nurse里面初始化一个Child类的对象,然后对这个Child类的对象增减一个观察,观察它的hapyValue值,如果变化,则出发一个方法来输出需要的结果。

(1)Child.h和Child.m

//Child.h文件
#import <Foundation/Foundation.h>
@interface Child : NSObject
@property(nonatomic,assign)NSInteger happyValue;
@end
//Child.m文件
#import "Child.h"
@implementation Child
-(id)init{
    //初始化为100,并设立一个定时器,每隔1秒钟调用Action方法来自减happyValue
    self=[super init];
    if (self!=nil) {
        self.happyValue=http://www.mamicode.com/100;>
(2)Nurse.h和Nurse.m

//Nurse.h文件
#import <Foundation/Foundation.h>
@class Child;
@interface Nurse : NSObject
@property(nonatomic,retain) Child *child;
-(id)initWithChild:(Child *)child;
@end
//Nurse.m文件
#import "Nurse.h"
#import "Child.h"
@implementation Nurse
-(id)initWithChild:(Child *)child{
    self=[super init];
    if (self!=nil) {
        //初始化一个child对象_child
        _child=child;
        //给这个_child添加一个观察,即观察_child对象的happyValue值,并且输出变化后的新值,把options的选项里地New改成Old就是旧值,也可以用|把两个都输出
        [_child addObserver:self forKeyPath:@"happyValue" options:NSKeyValueObservingOptionNew context:@"xxx"];
    }
    return self;
}
//当被观察的值发生变化,上面那个添加的观察就会生效,而生效后下一步做什么,由下面这个是方法决定,下面是意思是输出变化值,即change
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSLog(@"%@",change);
}
@end

(3)main.m

#import <Foundation/Foundation.h>
#import "Child.h"
#import "Nurse.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Child *child=[[Child alloc]init];
        Nurse *nurse=[[Nurse alloc]initWithChild:child];
        [[NSRunLoop currentRunLoop]run];
    }
    return 0;
}

结果应该输出不断变化的happyValue值,但是不知哪里故障。了解整个流程是主要目的,暂时忽略吧。

目的是Nurse类来监测Child类的happyValue值是否变化,如变化则输出变化后的新值。

主要流程:

a:在Nurse类里给Child的对象设置一个观察addObserver;

b:当这个值发生变化了,那么就会触发这个观察;

c:触发之后就会调用observeValueForKeyPath,这个方法可以返回你需要的值。


【OC学习-32】KVO-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果