美文网首页ReactiveCocoa
iOS RAC - 集合RACTuple、RACSequence

iOS RAC - 集合RACTuple、RACSequence

作者: Codepgq | 来源:发表于2017-10-27 15:15 被阅读1311次

    文章系列
    《RACSignal 》
    《RACDisposable》
    《RACSubject、RACReplaySubject》
    《iOS RAC - 基本用法》
    《iOS RAC - 定时器》
    《iOS RAC - RACMulticastConnection》
    《iOS RAC - RACCommand》
    《iOS RAC - 核心方法bind》
    《iOS RAC - 集合RACTuple、RACSequence》
    《iOS RAC - rac_leftSelector》
    《iOS RAC - 映射》
    《iOS RAC - 过滤》
    《iOS RAC - 登录页面,MVVM》



    git地址

    了解过Swift的童鞋肯定知道元祖,在元祖中可以放入任何的数据类型,包括基本数据类型,但是在OC中数组只能存储对象。
    而RAC的Tuple就是把OC的数组进行了一层封装

    • 创建方法:
        [RACTuple tupleWithObjects:@"大吉大利",@"今晚吃鸡",@66666,@99999, nil]
        [RACTuple tupleWithObjectsFromArray:@[@"大吉大利",@"今晚吃鸡",@66666,@99999]];
        [RACTuple tupleWithObjectsFromArray:@[@"大吉大利",@"今晚吃鸡",@66666,@99999] convertNullsToNils:YES];
    
    • 使用
        RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"大吉大利",@"今晚吃鸡",@66666,@99999] convertNullsToNils:YES];
        
        id value = tuple[0];
        id value2 = tuple.first;
        NSLog(@"%@ %@",value,value2);
    
    2017-10-27 14:05:35.601 RAC[6987:3414126] 大吉大利 大吉大利
    

    其实他就是一个数组……

    然后还有一个类:RACSequence,这个类可以用来代替我们的NSArray或者NSDictionary,主要就是用来快速遍历,和用来字段转模型。

    1 代替数组

        NSArray * array = @[@"大吉大利",@"今晚吃鸡",@66666,@99999];
        
        RACSequence * sequence = array.rac_sequence;
        
        RACSignal * signal = sequence.signal;
        
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    看完上面的代码你可能会觉得操作反而变得麻烦了,还转来转去的……有病,但是RAC是可以链式调用的,于是又可能写成下面的样子

        NSArray * array = @[@"大吉大利",@"今晚吃鸡",@66666,@99999];
        [array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    是不是瞬间就短了,而且不用写for啦

    2 代替字典

          NSDictionary * dict = @{@"大吉大利":@"今晚吃鸡",
                                @"666666":@"999999",
                                @"dddddd":@"aaaaaa"
                                };
        
        [dict.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
            NSLog(@"%@",x);
        }];
    
    是不是也很方便啊

    通过打印的数据我们可以分析得出,里面是一个数组,其中第一个元素是key,第二个元素是value,所以我们又可以这样子写:

        NSDictionary * dict = @{@"大吉大利":@"今晚吃鸡",
                                @"666666":@"999999",
                                @"dddddd":@"aaaaaa"
                                };
        
        [dict.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
            NSLog(@"key - %@ value - %@",x[0],x[1]);
        }];
    
    字典



    如果你觉得这样子还不够爽,那么还有更简单的

        NSDictionary * dict = @{@"大吉大利":@"今晚吃鸡",
                                @"666666":@"999999",
                                @"dddddd":@"aaaaaa"
                                };
        
        [dict.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
            RACTupleUnpack(NSString *key,id value) = x;
            NSLog(@"key - %@ value - %@",key,value);
        }];
    

    3 字典转模型

        NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Model.plist" ofType:nil];
        
        NSArray * array = [NSArray arrayWithContentsOfFile:filePath];
        
        NSMutableArray *mArray = [NSMutableArray array];
        
        [array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
            [mArray addObject:[Person personWithDict:x]];
        }];
    

    写到这里还是感觉不到RAC的厉害啊,完全感觉不到有木有?这个和我们去使用enumerateObjectsUsingBlock没啥区别啊。

    当然RAC还有更简单的

        NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Model.plist" ofType:nil];
        
        NSArray * array = [NSArray arrayWithContentsOfFile:filePath];
        
        //id  _Nullable value 这里的value就是NSDictionary 所以我们就改成NSDictionary
        NSArray * persons = [[array.rac_sequence map:^id _Nullable(NSDictionary* value) {
            return [Person personWithDict:value];
        }] array];
        
        NSLog(@"%@",persons);
    

    我们简单的分析一下为什么啊
    在使用.signal的时候,会依次给我们数组的元素,然后我们通过元素转化成为模型,这个和map是一样的,唯一不同的是map会要求我们把模型回传给他,然后他给我们保存起来,最后在使用array这个方法,把RACSequence对象给转化为数组。

    相关文章

      网友评论

        本文标题:iOS RAC - 集合RACTuple、RACSequence

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