一,概述
KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。
系統框架已經支持KVO,所以程序員在使用的時候非常簡單。
1. 注冊,指定被觀察者的屬性,
2. 實現回調方法
3. 移除觀察
假設一個場景,股票的價格顯示在當前屏幕上,當股票價格更改的時候,實時顯示更新其價格。
1.定義DataModel
@interface?StockData?:?NSObject?{
NSString?*?stockName;
floatprice;
}
@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的變化這種情況,就像上邊的例子那樣,當更改屬性的值后,監聽對象會立即得到通知。