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ā)。