1. 是啥春贸?
鍵值監(jiān)聽,一個對象(觀察者)通過監(jiān)聽另一個對象(被觀察者)屬性值的變化遗遵,而據(jù)此作出反應(yīng)的一種方法萍恕。常用于處理一對多的依賴關(guān)系。
2.怎么用车要?
觀察者需要 注冊觀察者允粤,指定被觀察者及其屬性、實現(xiàn)回調(diào)方法翼岁、移除監(jiān)聽类垫;被觀察者需要改變相應(yīng)的屬性值。
2.1 觀察者 添加被觀察者及其屬性值
[self.userModel addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];//觀察者(self)監(jiān)聽userModel的name屬性琅坡,
2.2 觀察者實現(xiàn)回調(diào)方法(系統(tǒng)方法 keyPath 監(jiān)聽的屬性名 change 改變的值 context 用來區(qū)分不同的KVO)
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context悉患;
2.3 移除監(jiān)聽(-dealloc方法中)
[self.userModel removeObserver:self forKeyPath:@"name" context:nil];
2.4 被監(jiān)聽者 改變對應(yīng)屬性的值
[self.userModel setValue:@"張三豐" forkey:@"name"];
3.什么時候用?
常用于處理Model和View層的解耦合脑蠕,當(dāng)Model的一個屬性值改變了购撼,監(jiān)聽這個屬性的View要做對應(yīng)的處理。
4.用的時候需要注意什么谴仙?
4.1 觀察者只能監(jiān)聽被觀察者的屬性迂求,而且屬性是用字符串表示的,所以一旦寫錯晃跺,編譯器不會檢查揩局;
4.2 對被觀察的屬性重構(gòu)將導(dǎo)致我們觀察代碼不再可用;
4.3 可以提供觀察的屬性的最新值以及先前值掀虎;[change objectForKey:NSKeyValueChangeNewKey];//NSKeyValueChangeOldKey
4.4 注意:KVO的響應(yīng)和觀察的值變化是在一個線程上凌盯。
5.其他
5.1 基本上所有的代碼都是在觀察者的類里面寫的付枫,被觀察者只需要改變他的被觀察屬性值就可以了。
5.2 在事件處理上驰怎,如果是屬性層的事件阐滩,就用KVO; 其他事件用代理或block;模塊不緊密或者以上實現(xiàn)困難的話再用通知(性能低)县忌。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者