RAC
的作用:
将要
处理的事情
和监听的事情
的代码放在一起,符合高聚合
、低耦合
的开发思想。
1、RAC
用在数组和字典的遍历巧妙用法
- 遍历数组
@property (nonatomic, strong) NSArray<NewsItemModel *> *dataSourceArr;
// 遍历下数组
[self.dataSourceArr.rac_sequence.signal subscribeNext:^(NewsItemModel * _Nullable x) {
NSLog(@"%@", x);
}];
- 遍历字典(使用
RACTupleUnpack
这个强大的宏,可以直接取得字典中的key
,value
)
// 遍历字典
NSDictionary *dict = @{@"name":@"福成", @"age":@22, @"work":@"iOS"};
[dict.rac_sequence.signal subscribeNext:^(id _Nullable x) {
// 这是一个强大的宏
RACTupleUnpack(NSString *key, NSString *value) = x;
NSLog(@"%@--%@", key, value);
}];
- 字典转模型
NSArray * dataArr = (NSArray *)[result objectForKey:@"data"];
NSMutableArray *listItemArr = @[].mutableCopy;
// 这个是异步获取,会先走下面的代码,
[dataArr.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NewsItemModel *model = [NewsItemModel yy_modelWithDictionary:(NSDictionary *)x];
[listItemArr addObject:model];
}];
-
map
映射
NSMutableArray *listItemArr = @[].mutableCopy;
// RAC的高级用法 array方法:将返回的模型自动添加到数组中
listItemArr = [[[dataArr.rac_sequence map:^id _Nullable(id _Nullable value) {
// value: 集合中的元素
// id : 返回的对象就是映射的值
return [NewsItemModel yy_modelWithDictionary:value];
}] array] mutableCopy];
RAC
开发中的常见用法
1、代替代理
- 有两种方法:
RACSubject
:可以传值
// 在对象类.h中添加
@property (nonatomic, strong) RACSubject *btnSignal;
// 在.m中实现
- (RACSubject *)deleteBtnSignal {
if (_deleteBtnSignal == nil) {
_deleteBtnSignal = [[RACSubject alloc] init];
}
return _deleteBtnSignal;
}
// 在点击事件中
[self.btnSignal sendNext:@1];
// 在控制器中拿到这个类的对象
[_view.btnSignal subscribeNext:^(id _Nullable x) {
NSLog(@"监听到了点击事件");
}];
rac_signalForSelector,不能传值(用于监听某个对象有没有调用某个方法)
// 监听某个对象有没有调用某个方法
[[self rac_signalForSelector:@selector(viewWillAppear:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"调用了viewWillAppear");
}];
2、代替KVO
:
// 这个用起来不是很方便 还要导入头文件
[_mainTableView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
}];
[[_mainTableView rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
3、监听事件:
[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"删除按钮点击");
}];
4、代替通知:
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"change" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
}];
5、监听文本框文字改变:
[_textField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
6、处理当界面有多次请求时,需要都获取到数据时,才能展示界面。
- (void)RAC_liftSelector {
RACSignal *hotSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"请求热销数据");
[subscriber sendNext:@"hot Data"];
return nil;
}];
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"请求最新数据");
[subscriber sendNext:@"New Data"];
return nil;
}];
// 数组:存放信号
// 当数组中的所有信号都发送数据的时候。才会执行方法
// 方法的参数:必须跟数组的信号一一对应
// 方法的参数,就是每一个信号发送的数据
[self rac_liftSelector:@selector(updateUIWithHotData:newData:) withSignalsFromArray:@[hotSignal, newSignal]];
}
- (void)updateUIWithHotData:(NSString *)hotData newData:(NSString *)newData {
NSLog(@"%@----%@", hotData, newData);
}