一、addObserver:forkeyPath:options:context:各个参数的作用分别是什么?observer中需要实现哪个方法才能获得KVO回调?
iOS中通知方面的内容:NSNotificationCenter通知中心、KVO(Key-Value Observing)键值观察 、Delegate代理、Callback回调。
KVO是Key-Value Observing的缩写,是对象间监控对方状态的改变,并做出反应的机制。对象可以为自己的属性注册观察者,当这个属性的值发生了改变,系统会对这些注册的观察者做出通知。
1、为对象的属性注册观察者。
- (void)addObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(void *)context
observer:观察者对象。其必须实现方法observeValueForKeyPath:ofObject:change:context:。
keyPath:被观察的属性,其不能为nil。
options:设定通知观察者时传递的属性值,是传改变前的还是改变后的,通常设置为NSKeyValueObservingOptionNew。
context:一些其他的需要传递给观察者的上下文信息,通常设置为nil。
比如:
Person *myPerson = [[Person alloc] init];
[myPerson addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
2、观察者接收通知,观察者通过实现下面的方法,完成对属性改变的响应。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
keyPath:被观察的属性,其不能为nil。
object:被观察者的对象。
change:属性值,根据上面提到的Options设置,给出对应的属性值。
context:注册观察者传递的context对象。
比如:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"age"]) {
NSLog(@"age is changed age = %@", [change valueForKey:NSKeyValueChangeNew