1. 程式人生 > >iOS:KVO的概述與使用

iOS:KVO的概述與使用

一,概述

KVO,即:Key-Value Observing,它提供一種機制,當指定的物件的屬性被修改後,則物件就會接受到通知。簡單的說就是每次指定的被觀察的物件的屬性被修改後,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];
}

四,小結

KVO這種編碼方式使用起來很簡單,很適用與datamodel修改後,引發的UIVIew的變化這種情況,就像上邊的例子那樣,當更改屬性的值後,監聽物件會立即得到通知。