Key-Value Observing

一、概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

这样的架构有很多好处:

首先,开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。这是KVO 机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可 以在工程里使用。

其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

 

二、使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

三、实例

1.定义DataModel

@interface StockData : NSObject {  
    NSString * stockName;  
    float price;  
}  
@end  
@implementation StockData  
@end 

2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

- (void)viewDidLoad  {  
    [super viewDidLoad];  
  
    stockForKVO = [[StockData alloc] init];  
    [stockForKVO setValue:@"searph" forKey:@"stockName"];  
    [stockForKVO setValue:@"10.0" forKey:@"price"];      
    [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  
    myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
    myLabel.textColor = [UIColor redColor];  
    myLabel.text = [stockForKVO valueForKey:@"price"];  
    [self.view addSubview:myLabel];  
     
    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    b.frame = CGRectMake(0, 0, 100, 30);  
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
    [self.view addSubview:b];  
}  

3.当点击button的时候,调用buttonAction方法,修改对象的属性

-(void) buttonAction  {  
    [stockForKVO setValue:@"20.0" forKey:@"price"];  
}

4. 实现回调方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  {  
    if([keyPath isEqualToString:@"price"]) {  
        myLabel.text = [stockForKVO valueForKey:@"price"];  
    }  
}

5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

- (void)dealloc  {  
    [super dealloc];  
    [stockForKVO removeObserver:self forKeyPath:@"price"];  
    [stockForKVO release];  
}

参考:点击打开链接





posted @ 2014-05-01 17:59  Forrest.Wang  阅读(135)  评论(0编辑  收藏  举报