ReactiveCocoa

iOS RAC - 集合RACTuple、RACSequence

2017-10-27  本文已影响1311人  Codepgq

文章系列
《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对象给转化为数组。

上一篇 下一篇

猜你喜欢

热点阅读