文章系列
《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》
了解过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
对象给转化为数组。
网友评论