iOS中的KVO

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章