美文网首页iOS经验总结
iOS开发·RAC的使用

iOS开发·RAC的使用

作者: 富城 | 来源:发表于2020-12-05 20:42 被阅读0次
    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);
    }
    

    相关文章

      网友评论

        本文标题:iOS开发·RAC的使用

        本文链接:https://www.haomeiwen.com/subject/dexnwktx.html