在網上流傳一個非常經典的解釋<響應式編程的概念>
在程序開發中:
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方法