天天看點

iOS中的KVO使用 一,什麼是KVO二,使用方法流程三,執行個體解說:四,小結KVO這種編碼方式使用起來很簡單,很适用與datamodel修改後,引發的UIVIew的變化這種情況,就像上邊的例子那樣,當更改屬性的值後,監聽對象會立即得到通知。

一,什麼是KVO

KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。

二,使用方法流程

系統架構已經支援KVO,是以程式員在使用的時候非常簡單。

1. 注冊,指定被觀察者的屬性,

2. 實作回調方法

3. 移除觀察

三,執行個體解說:

假設一個場景,定義一個對象的屬性,當其值更改的時候,控制器能夠監聽到其值的改變。

1.定義DataModel,

[cpp]  view plain copy

  1. @interface StockData : NSObject {  
  2.     NSString * stockName;  
  3.     float price;  
  4. }  
  5. @end  
  6. @implementation StockData  
  7. @end  

2.定義此對象為某個Controller的屬性,執行個體化它,監聽它的屬性,并顯示在目前的View裡邊

[cpp]  view plain copy

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     stockForKVO = [[StockData alloc] init];  
  5.     [stockForKVO setValue:@"searph" forKey:@"stockName"];  
  6.     [stockForKVO setValue:@"10.0" forKey:@"price"];      
  7.     [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  //為對象的price屬性注冊一個監聽都,一般是目前的控制器。
  8.     myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
  9.     myLabel.textColor = [UIColor redColor];  
  10.     myLabel.text = [stockForKVO valueForKey:@"price"];  
  11.     [self.view addSubview:myLabel];  
  12.     UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  13.     b.frame = CGRectMake(0, 0, 100, 30);  
  14.     [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
  15.     [self.view addSubview:b];  
  16. }  

3.當點選button的時候,調用buttonAction方法,修改對象的屬性

[cpp]  view plain copy

  1. -(void) buttonAction  
  2. {  
  3.     [stockForKVO setValue:@"20.0" forKey:@"price"];  
  4. }  

4. 實作回調方法

[cpp]  view plain copy

  1. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  //在控制器中實作監聽方法的回調
  2. {  
  3.     if([keyPath isEqualToString:@"price"])  
  4.     {  
  5.         myLabel.text = [stockForKVO valueForKey:@"price"];  
  6.     }  
  7. }  

5.增加觀察與取消觀察是成對出現的,是以需要在最後的時候,移除觀察者,這一點和通知是一樣的,否則可能會出現錯誤。

[cpp]  view plain copy

  1. - (void)dealloc  
  2. {  
  3.     [super dealloc];  
  4.     [stockForKVO removeObserver:self forKeyPath:@"price"];  
  5.     [stockForKVO release];  
  6. }  

四,小結

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