一,概述
KVO,即:Key-Value Observing,它提供一種機(jī)制考蕾,當(dāng)指定的對(duì)象的屬性被修改后,則對(duì)象就會(huì)接受到通知会宪。簡(jiǎn)單的說(shuō)就是每次指定的被觀(guān)察的對(duì)象的屬性被修改后肖卧,KVO就會(huì)自動(dòng)通知相應(yīng)的觀(guān)察者了。
系統(tǒng)框架已經(jīng)支持KVO塞帐,所以程序員在使用的時(shí)候非常簡(jiǎn)單。
1. 注冊(cè)巍沙,指定被觀(guān)察者的屬性葵姥,
2. 實(shí)現(xiàn)回調(diào)方法
3. 移除觀(guān)察
假設(shè)一個(gè)場(chǎng)景,股票的價(jià)格顯示在當(dāng)前屏幕上赎瞎,當(dāng)股票價(jià)格更改的時(shí)候牌里,實(shí)時(shí)顯示更新其價(jià)格颊咬。
1.定義DataModel
@interface?StockData?:?NSObject?{
NSString?*?stockName;
floatprice;
}
@end
@implementation?StockData
@end
2.定義此model為Controller的屬性务甥,實(shí)例化它牡辽,監(jiān)聽(tīng)它的屬性,并顯示在當(dāng)前的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.當(dāng)點(diǎn)擊button的時(shí)候敞临,調(diào)用buttonAction方法态辛,修改對(duì)象的屬性
-(void)?buttonAction{
[stockForKVO?setValue:@"20.0"forKey:@"price"];
}
4. 實(shí)現(xiàn)回調(diào)方法
-(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void*)context{
if([keyPath?isEqualToString:@"price"]){
myLabel.text?=?[stockForKVO?valueForKey:@"price"];
}
}
5.增加觀(guān)察與取消觀(guān)察是成對(duì)出現(xiàn)的,所以需要在最后的時(shí)候挺尿,移除觀(guān)察者
-?(void)dealloc{
[super?dealloc];
[stockForKVO?removeObserver:self?forKeyPath:@"price"];
[stockForKVO?release];
}