KVO全称为key-value oberserving, 源于观察者模式,即key对应的value改变,observer要做出反应。类似Model对Controller发出通知Notification. Notification通常用于响应系统的一些变化,例如键盘出现、消失等。
在数据模型中,将myController设置为观察者,keyPath为myModel的属性,options通常为NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld, context为任意data, 用于传入observeValueForKeyPath:ofObject:change:context:
[myModel addObserver:(NSObject *)myController forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context]
在myController中,实现observeValueForKeyPath:ofObject:change:context:方法来相应value的变化。
// // ViewController.m // KvoTest // // Created by luzheng1208 on 14/12/7. // Copyright (c) 2014年 luzheng. All rights reserved. // #import "ViewController.h" @interface ViewController () { } @property (strong, nonatomic) NSString *name; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.name = @"Xiao Ming"; [self registerForKVO]; //[self willChangeValueForKey:@"name"]; self.name = @"Xiao Hong"; self.name = @"Xiao Li"; //[self didChangeValueForKey:@"name"]; } - (void)dealloc { [self unregisterForKVO]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - KVO - (void)registerForKVO { [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; } - (void)unregisterForKVO { [self removeObserver:self forKeyPath:@"name"]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"name"]) { NSLog(@"The old value is %@", [change objectForKey:NSKeyValueChangeOldKey]); NSLog(@"The new value is %@", [change objectForKey:NSKeyValueChangeNewKey]); } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } @end
其输出为:
2014-12-07 23:02:38.951 KvoTest[19553:2584967] The old value is Xiao Ming 2014-12-07 23:02:38.954 KvoTest[19553:2584967] The new value is Xiao Hong 2014-12-07 23:02:38.954 KvoTest[19553:2584967] The old value is Xiao Hong 2014-12-07 23:02:38.954 KvoTest[19553:2584967] The new value is Xiao Li
上面的例子中未引入Model。
KVO还有手动实现的方法,具体参见blog: http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html
时间: 2024-10-13 00:48:39