本文来源:http://www.wuleilei.com/blog/332
一、概述
KVO,即:Key Value Observing,直译为:基于键值的观察者。
它提供一种机制,当指定的对象的属性被修改后,对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者。
在下文的示例中。图书(Book类),就是个实体。它的属性有书名(name)和价格(price)。那么,在界面开发中,可能有多个视图和这个实体有关联。如果实体(Book)的价格(price)发生了变化,这些关联的界面都要被修改。
二、使用方法
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1. 注册,指定被观察者的属性;
2. 实现回调方法;
3. 移除观察。
三、实例
假设有一个Book类,此类有name和price属性,当price发生变化时,界面上的价格立刻显示为最新的价格。
1. Book类,头文件:
#import <Foundation/Foundation.h> @interface Book : NSObject { NSString *name; float price; } @end
Book类的实现文件,没做任何事情,不贴了。
2. 在viewController里面实例化它,监听它的属性,并在label中显示它的属性。
_book = [[Book alloc] init]; [_book setValue:@"C语言" forKey:@"name"]; [_book setValue:@"10.0" forKey:@"price"]; [_book addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
3. 点击button的时候,更改book的price属性。
- (IBAction)changePrice:(id)sender { [_book setValue:@"12.1" forKey:@"price"]; }
4. 实现回调方法。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"price"]) { NSLog(@"%@", change); } }
5. 增加观察与取消观察是成对出现的,所以在book释放前,要删除观察者。
- (void)dealloc { [_book removeObserver:self forKeyPath:@"price"]; [_book release]; [super dealloc]; }
点击此处下载示例。