利用RAC/KVO直接监听数组变化的实现

///实现原理,利用RAC给数组创建一个分类,为了对数组的增删改监听 

大家在使用RAC 对数组进行监听时候是不生效的,其实这点原因也是很简单,知道KVO底层的小伙伴应该知道,KVO的底层其实是监听的set方法,当我们平时的属性值发生改变时候,RAC都能正常监听,但是数组的增删改是没有set方法的,下面我在大神的基础上做了一个简单的demo 可以直接copy 使用,原来也是基于RAC库的

.h文件

#import <Foundation/Foundation.h>

/*
 *  添加一个分类,用于坚挺数组的变化
 */

NS_ASSUME_NONNULL_BEGIN

@interface NSMutableArray (JJArrayKVO)

/// NSMutableArray 监听方法
/// @param handler 回调
-(void)jj_addKVO:(void(^)(NSMutableArray *array))handler;

@end

NS_ASSUME_NONNULL_END

.m文件

#import "NSMutableArray+JJArrayKVO.h"

@implementation NSMutableArray (JJArrayKVO)

- (void)jj_addKVO:(void (^)(NSMutableArray * _Nonnull))handler {
    /// add
    [self _jj_addSelector:@selector(addObject:) handler:handler];
    
    /// set
    [self _jj_addSelector:@selector(setObject:atIndexedSubscript:) handler:handler];
    
    
    /// insert
    [self _jj_addSelector:@selector(insertObject: atIndex:) handler:handler];
    [self _jj_addSelector:@selector(insertObject: atIndex:) handler:handler];
    
    ///replace
    [self _jj_addSelector:@selector(replaceObjectAtIndex: withObject:) handler:handler];
    
    /// remove
    [self _jj_addSelector:@selector(removeLastObject) handler:handler];
    [self _jj_addSelector:@selector(removeObject:) handler:handler];
    [self _jj_addSelector:@selector(removeAllObjects) handler:handler];
    [self _jj_addSelector:@selector(removeObjectAtIndex:) handler:handler];
}

-(void)_jj_addSelector:(SEL)selector handler:(void(^)(NSMutableArray *array))handler{
    
    __weak typeof(self) weakSelf = self;
    [[self rac_signalForSelector:selector] subscribeNext:^(id  _Nullable x) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        if (handler) {
            handler(strongSelf);
        }
    }];
}
@end

猜你喜欢

转载自blog.csdn.net/qq_42924450/article/details/132160345