一,概述
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
二,使用方法
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 移除观察
三,实例:
假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。
1.定义DataModel,
- @interface
StockData : NSObject { -
NSString * stockName; -
float price; - }
- @end
- @implementation
StockData - @end
@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:NSKeyValueObservingOptio nNew|NSKeyValueObservingOptio nOld 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:UIControlEventTouchUpIns ide]; -
[self.view addSubview:b]; -
- }
- (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|NSKeyValueObservingOptio nOld 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:UIControlEventTouchUpIns ide]; [self.view addSubview:b]; }
3.当点击button的时候,调用buttonAction方法,修改对象的属性
- -(void)
buttonAction - {
-
[stockForKVO setValue:@"20.0" forKey:@"price"]; - }
-(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"]; -
} - }
-(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]; - }
- (void)dealloc { [super dealloc]; [stockForKVO removeObserver:self forKeyPath:@"price"]; [stockForKVO release]; }