一、解析
1. KVO
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
(NSObject类已实现了NSKeyValueObserving协议,所以不用再声明)
2. KVO的使用步骤
1)通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
2)重写监听器的observeValueForKeyPath: ofObject: change: context:方法
3. KVO的常用操作方法
- 注册指定Key路径的监听器: addObserver: forKeyPath: options: context:
- 删除指定Key路径的监听器: removeObserver: forKeyPath、removeObserver: forKeyPath: context:
- 回调监听: observeValueForKeyPath: ofObject: change: context:
二、实现
1. 被观察的对象:(self或者其他被观察对象)
// 被观察对象的已有属性:
@property (nonatomic) NSMutableString *str;
// 对该属性添加观察者:
[self addObserver:self.ob //观察者
forKeyPath:@"str" //观察的属性的名称
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld//属性变化设置选项
context:@"pass context"//额外信息
];
2. 观察者,实现相应委托
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context{
NSLog(@"Property '%@' of object '%@' changed: %@ context: %@",keyPath,object,change,context);
}
- keyPath参数是被关注的属性
- object是被关注的对象
- change是字典类型,包含了属性变化的内容,这些内容与注册时属性变化设置的选项(options参数)有关。
- context是注册时传递的上下文内容。