首页 > 代码库 > 【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-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。