KVO:(key-value-Observer)键值观察者,是观察者设计模式的一种具体实现,基于KVC的技术实现
1.添加关注
[kvoGirl addObserver:self forKeyPath:@"hobby" options:(NSKeyValueObservingOptionPrior) context:nil];
kvoGirl.hobby = @"coding";
kvoGirl.hobby = @"music";
注:上面的代码中
参数1:观察者
参数2:观察他的那个键值
参数3:如何观察(NSKeyValueObservingOptionNew:当属性发生变化时,执行方法,并且打印新的值, NSKeyValueObservingOptionOld:当属性发生变化时,执行方法,并且打印改变前的值, NSKeyValueObservingOptionInitial:当属性值被初始化或变化时,执行方法, NSKeyValueObservingOptionPrior:当属性发生变化时,执行两次方法(改变前和改变后,通过notificationIsPrior来判断))
参数4:用于传值
2.为通知中心添加观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(paly) name:@"放假" object:nil];
注:上面的代码中:
NSNotificationCenter,通知中心,继承于NSobject
参数1:观察者
参数2:收到通知,观察者执行的方法
参数3:通知的名字
参数4:传值
关联的方法:
- (void)paly {
NSLog(@"啪啪啪");
}
在这里我用个button按钮来做具体开关控制
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 100, 100, 100);
button.backgroundColor = [UIColor blackColor];
[button setTitle:@"通知" forState:UIControlStateNormal];
[button addTarget:self action:@selector(pressButton) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button];
button关联的方法
- (void)pressButton {
//发通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"放假" object:nil];
}
当成为观察者后,对象的属性值一旦发生变化,就会执行这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"keyPath:%@", keyPath);//观察的键值
NSLog(@"object:%@", object);//观察的对象
NSLog(@"change:%@", change);//新赋的值
//字典中的kind值,见:NSKeyValueChange
NSLog(@"context:%@", context);//传的参数
}