KVO监听很强大,但是直接使用也存在一些问题,比如在多线程下重复添加,重复移除的问题。代码比较分散不好维护等问题。为了解决这些问题,愉快的搬砖我这边进行了封装,具体代码如下:
/**
添加keyPath监听
@param observer 观察者
@param keyPath keyPath
@param options options
@param block 回调
*/
- (void)jk_addObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
withBlock:(void(^)(NSDictionary *change,void *context))block;
/**
添加keyPath监听
@param observer 观察者
@param keyPath keyPath
@param options options
@param context context
@param block 回调
*/
- (void)jk_addObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(nullable void *)context
withBlock:(void(^)(NSDictionary *change,void *context))block;
/**
移除keyPath监听
@param observer 观察者
@param keyPath keyPath
*/
- (void)jk_removeObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath;
/**
移除某个observer下的对应的keyPath列表监听
@param observer 观察者
@param keyPaths keyPath组成的数组
*/
- (void)jk_removeObserver:(NSObject *)observer
forKeyPaths:(NSArray <NSString *>*)keyPaths;
/**
移除某个keyPath的所有obsevers对应的监听
@param observers 观察者数组
@param keyPath keyPath
*/
- (void)jk_removeObservers:(NSArray <NSObject *>*)observers
forKeyPath:(NSString *)keyPath;
/**
所有的观察者列表
@return 观察者列表的数组
*/
- (NSArray *)jk_observers;
/**
所有的被监听的keyPath列表
@return 被监听的keyPath组成的列表
*/
- (NSArray *)jk_observeredKeyPaths;
/**
某个keyPath对应的观察者列表
@param keyPath keyPath
@return 观察者列表的数组
*/
- (NSArray *)jk_observersForKeyPath:(NSString *)keyPath;
/**
某个观察者监听的keyPath组成的列表
@param observer 观察者
@return keyPath组成的列表
*/
- (NSArray *)jk_keyPathsObserveredBy:(NSObject *)observer;
内部实现了添加监听,移除监听的线程安全保护,以及防止重复添加重复移除的逻辑
大家可以直接 通过pod集成
pod 'JKKVOHelper'
源码地址:https://github.com/xindizhiyin2014/JKKVOHelper.git
更多技术干货文章可以扫描下方二维码: