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.csdn.net/detail/u011918080/6986431