KVO机制

来源:互联网 发布:淘宝穿越火线刷等级 编辑:程序博客网 时间:2024/06/05 08:37

Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。

(这样的机制听起来类 似Notification,但是notification是需要一个发送notification的对象,一般是 notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)

适用kvo时,通常遵循如下流程:

1 注册:

-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context

keyPath就是要观察的属性值,options给你观察键值变化的选择而context方便传输你需要的数据(注意这是一个void型)

2 实现变化方法:

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary
 *)change context:(void*)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。


假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

1.定义DataModel,

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


2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

  1. (void)viewDidLoad  
  2.  
  3.     [super viewDidLoad];  
  4.   
  5.     stockForKVO [[StockData alloc] init];  
  6.     [stockForKVO setValue:@"searph" forKey:@"stockName"];  
  7.     [stockForKVO setValue:@"10.0" forKey:@"price"];      
  8.     [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  9.   
  10.     myLabel [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
  11.     myLabel.textColor [UIColor redColor];  
  12.     myLabel.text [stockForKVO valueForKey:@"price"];  
  13.     [self.view addSubview:myLabel];  
  14.      
  15.     UIButton [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  16.     b.frame CGRectMake(0, 0, 100, 30);  
  17.     [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
  18.     [self.view addSubview:b];  
  19.   
  20.  


3.当点击button的时候,调用buttonAction方法,修改对象的属性

  1. -(voidbuttonAction  
  2.  
  3.     [stockForKVO setValue:@"20.0" forKey:@"price"];  
  4.  

4. 实现回调方法

  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.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

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

小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。


0 0
原创粉丝点击