iOS开发·RAC的使用

RAC的作用:

将要处理的事情监听的事情的代码放在一起,符合高聚合低耦合的开发思想。

1、RAC用在数组和字典的遍历巧妙用法
  • 遍历数组
@property (nonatomic, strong) NSArray<NewsItemModel *> *dataSourceArr;

// 遍历下数组
[self.dataSourceArr.rac_sequence.signal subscribeNext:^(NewsItemModel * _Nullable x) {
    NSLog(@"%@", x);
}];
  • 遍历字典(使用RACTupleUnpack这个强大的宏,可以直接取得字典中的keyvalue
// 遍历字典
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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容