码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-10 15:59:50      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:io   ar   strong   for   文件   cti   log   on   c   

什么是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,这个方法可以返回你需要的值。


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

标签:io   ar   strong   for   文件   cti   log   on   c   

原文地址:http://blog.csdn.net/weisubao/article/details/39179883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!