文章系列
《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的童鞋肯定知道元祖,在元祖中可以放入任何的數(shù)據(jù)類型扔水,包括基本數(shù)據(jù)類型痛侍,但是在OC中數(shù)組只能存儲對象。
而RAC的Tuple就是把OC的數(shù)組進行了一層封裝
- 創(chuàng)建方法:
[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] 大吉大利 大吉大利
其實他就是一個數(shù)組……
然后還有一個類:RACSequence魔市,這個類可以用來代替我們的NSArray或者NSDictionary主届,主要就是用來快速遍歷,和用來字段轉模型待德。
1 代替數(shù)組
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);
}];
通過打印的數(shù)據(jù)我們可以分析得出,里面是一個數(shù)組涧偷,其中第一個元素是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
沒啥區(qū)別啊确封。
當然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
的時候,會依次給我們數(shù)組的元素再菊,然后我們通過元素轉化成為模型爪喘,這個和map
是一樣的,唯一不同的是map
會要求我們把模型回傳給他纠拔,然后他給我們保存起來秉剑,最后在使用array
這個方法,把RACSequence
對象給轉化為數(shù)組稠诲。