OC实现KVO监听block方式响应事件

   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
更多技术干货文章可以扫描下方二维码:
在这里插入图片描述

发布了231 篇原创文章 · 获赞 110 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/HHL110120/article/details/100176210
今日推荐