///实现原理,利用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