什么是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=100;
[NSTimer timerWithTimeInterval:1 target:self selector:@selector(Action:) userInfo:nil repeats:YES];
}
return self;
}
//Action方法是自减happyValue值
-(void)Action:(NSTimer *)timer{
self.happyValue--;
}
@end
(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,这个方法可以返回你需要的值。