在网上流传一个非常经典的解释<响应式编程的概念>
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化
下面这个例子也是一样,当点击屏幕时,age+1,当age发生改变时就将对应值打印出来
此处用到的KVO,监听age,一旦改变就处理你需要做的事情
- (void)viewDidLoad {
[super viewDidLoad];
_person = [[Person alloc]init];
//_person添加观察者
[_person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
// 监听的属性只要一改变就调用
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"%ld",_person.age);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_person.age ++;
}
KVO底层实现:
- 1.动态创建NSKVONotifying_Person,NSKVONotifying_Person是Person子类,做KVO
- 2.修改当前对象的isa指针->NSKVONotifying_Person
- 3.只要调用对象的set,就会调用NSKVONotifying_Person的set方法
- 4.重写NSKVONotifying_Person的set方法: 1.[super set:] 2.通知观察者,告诉你属性改变
- 总结就是去判断有没有调用一个对象的set方法