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就能接收到。
change:(NSDictionary *)change context:(void*)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。
1.定义DataModel,
- @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]; -
- }
3.当点击button的时候,调用buttonAction方法,修改对象的属性
- -(void)
buttonAction - {
-
[stockForKVO setValue:@"20.0" forKey:@ "price"]; - }
4. 实现回调方法
- -(void)observeValueForKeyPath:(NSString
*)keyPath voidofObject:(id)object change:(NSDictionary *)change context:( *)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的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。
0 0
- kvo机制
- KVO机制
- KVO 机制
- IOS KVO 机制
- KVO机制的应用
- KVC 和KVO机制
- objective-c KVO机制
- 键值监听KVO机制
- KVO实现机制
- KVO实现机制
- KVO/KVC机制
- ios之KVO机制
- KVO的实现机制
- KVO和通知机制
- IOS 的 KVO机制
- ios KVO机制探索
- 通知机制和KVO机制
- KVO实现机制 & 如何自己动手实现 KVO
- linux下.sh文件语法
- POJ1061——青蛙的约会(扩展GCD应用)
- Java基础:数据库(下)
- JAVA_WEB项目之三大框架中不使用HibernateTemplate而使用SessionFactory以及如何使用注解
- Maven 入门教程
- KVO机制
- poj all in all
- android javah Generate C and C++ Header File
- 合理构建产品形态(一)——谁是目标用户
- JSP简单练习-JSP指令
- Pascal Library
- FFT结果的物理意义(转)
- UVA573 The Snail
- const char*, char const*, char*const的区别