KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的地方非常广泛。(这样的机制听起来类似Notification,但是notification是需要一个发送notification的对象,一般是 notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)
下面是一个非常简单的kvo例子:
#import <Foundation/Foundation.h>
//定义模型类,设置相关的属性
@interface Book : NSObject
@property (nonatomic , copy) NSString *code;
@property (nonatomic , copy) NSString *name;
@property (nonatomic , copy) NSString *price;
@property (nonatomic , copy) NSString *date;
@end
#import "Book.h"
@implementation Book
@end
#import "ViewController.h"
#import "Book.h"
@interface ViewController ()
@end
@implementation ViewController {
Book *book1;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//根据之前定义的模型类,实例化一个模型对象,并进行相应初始化设置
book1 = [[Book alloc]init];
[book1 setValue:@"0001" forKey:@"code"];
//为已经实例化的模型类注册一个监听
[book1 addObserver:self forKeyPath:@"code" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"111"];
}
//定义一个可以改变模型类中某些值的操作,如一个按钮点击事件
- (IBAction)BtnClick:(id)sender {
//改变模型类中的值,并触发KVO的回调方法
[book1 setValue:@"0002" forKey:@"code"];
}
//当模型类中的值发生改变时,自动调用该方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"code"])
{
//可以输出旧值和新值,也可以进行其他操作
NSLog(@"change happen,old:%@ new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);
NSLog(@"%@",context);
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
DEMO的下载地址:http://download.youkuaiyun.com/detail/u011918080/6986431