iOS中KVO及KVOController原理使用

KVO是觀察者模式的一種實現(xiàn),利用KVO機制,能很方便地觀察對象某個屬性的變化。KVO的用法如下

1、添加KVO觀察

調(diào)用方法addObserver添加KVO、調(diào)用方法removeObserver移除KVO

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context NS_AVAILABLE(10_7, 5_0);

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

2、KVO回調(diào)

當(dāng)觀察的屬性發(fā)生變化的時候,通過如下方法通知給調(diào)用者

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary*)change context:(nullable void *)context

從上面可知,如果在項目中頻繁使用KVO尤其在一個VC里面要進行多次KVO,那么我們的observeValueForKeyPath方法基本上就是這樣寫了

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary*)change context:(nullable void *)context{

if(object == self.object1){

}

else if(object == self.object2){

}

else if(object == self.objectn){

}

}


除了在observeValueForKeyPath方法里面進行通知,能否擴展如下功能:

1、在block或者selector里面進行通知。

2、支持調(diào)用一個方法觀察一個對象的多個屬性。

3、支持線程安全

而facebook開源的輕量級庫KVOController就是為了解決上訴兩個問題的。他的實現(xiàn)原理很簡單,讓所有的觀察者通知都走FBKVOController的observeValueForKeyPath方法,通過內(nèi)部的一個HashTable來保留觀察者并且進行通知分發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容