iOS中KVO及KVOController原理使用

KVO是观察者模式的一种实现,利用KVO机制,能很方便地观察对象某个属性的变化。KVO的用法如下

1、添加KVO观察

调用方法addObserver添加KVO、调用方法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回调

当观察的属性发生变化的时候,通过如下方法通知给调用者

- (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、支持调用一个方法观察一个对象的多个属性。

3、支持线程安全

而facebook开源的轻量级库KVOController就是为了解决上诉两个问题的。他的实现原理很简单,让所有的观察者通知都走FBKVOController的observeValueForKeyPath方法,通过内部的一个HashTable来保留观察者并且进行通知分发。

你可能感兴趣的:(iOS中KVO及KVOController原理使用)