在網(wǎng)上流傳一個非常經(jīng)典的解釋<響應(yīng)式編程的概念>
在程序開發(fā)中:
a = b + c
賦值之后 b 或者 c 的值變化后煮剧,a 的值不會跟著變化
響應(yīng)式編程,目標(biāo)就是甚脉,如果 b 或者 c 的數(shù)值發(fā)生變化丸升,a 的數(shù)值會同時發(fā)生變化
下面這個例子也是一樣,當(dāng)點擊屏幕時,age+1,當(dāng)age發(fā)生改變時就將對應(yīng)值打印出來
此處用到的KVO,監(jiān)聽age,一旦改變就處理你需要做的事情
- (void)viewDidLoad {
[super viewDidLoad];
_person = [[Person alloc]init];
//_person添加觀察者
[_person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
// 監(jiān)聽的屬性只要一改變就調(diào)用
-(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底層實現(xiàn):
- 1.動態(tài)創(chuàng)建NSKVONotifying_Person,NSKVONotifying_Person是Person子類,做KVO
- 2.修改當(dāng)前對象的isa指針->NSKVONotifying_Person
- 3.只要調(diào)用對象的set,就會調(diào)用NSKVONotifying_Person的set方法
- 4.重寫NSKVONotifying_Person的set方法: 1.[super set:] 2.通知觀察者,告訴你屬性改變
- 總結(jié)就是去判斷有沒有調(diào)用一個對象的set方法