标签:blog http io ar os sp for strong on
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
标签:blog http io ar os sp for strong on
原文地址:http://www.cnblogs.com/lumouren009/p/4150124.html