文章系列
《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》
在之前的集合文章中我們使用到了map
场躯,他是RAC中主要的兩個映射方法之一
還有一個是flattenMap
谈为,這兩個方法是將我們的信號源的內(nèi)容映射成為一個新的信號。
先看看我們平時的用法:
RACSubject * subject = [RACSubject subject];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"what happend踢关?"];
然后先看看flattenMap
其實flattenMap
內(nèi)部也是在bind伞鲫,如下圖所示
內(nèi)部實現(xiàn)
之前bind的用法我們已經(jīng)了解過了,照葫蘆畫瓢
RACSubject * subject = [RACSubject subject];
RACSignal * signal = [subject flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
return [RACReturnSignal return:value];
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"what happend签舞?"];
現(xiàn)在我們把發(fā)送的數(shù)據(jù)稍微處理一下
RACSubject * subject = [RACSubject subject];
[[subject flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
value = [NSString stringWithFormat:@"%@ 你別問我秕脓,我也不知道柒瓣!",value];
return [RACReturnSignal return:value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"what happend?"];
處理數(shù)據(jù)
然后我們在使用map
完成上面的功能
RACSubject * subject = [RACSubject subject];
[[subject map:^id _Nullable(id _Nullable value) {
return [NSString stringWithFormat:@"%@ 你別問我吠架,我也不知道芙贫!",value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"what happend?"];
map
然后在多發(fā)幾次數(shù)據(jù)看看會發(fā)生什么诵肛?
多發(fā)數(shù)據(jù)
兩者對比屹培,是不是map要更簡潔呢怔檩?既然map
要比flattenMap
更好用敬特,那么為什么還有flattenMap
呢?
flattenMap
當然是有他獨特的地方啦膛虫!在開發(fā)過程中共耍,他更適合用于處理信號中的信號
RACSubject * subjectOfSignal = [RACSubject subject];
RACSubject * subject1 = [RACSubject subject];
[subjectOfSignal sendNext:subject1];
[subject1 sendNext:@"弄啥嘞"];
之前我們的做法有兩種:
第一種:雙重訂閱
RACSubject * subjectOfSignal = [RACSubject subject];
RACSubject * subject1 = [RACSubject subject];
[subjectOfSignal subscribeNext:^(id _Nullable x) {
[x subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}];
[subjectOfSignal sendNext:subject1];
[subject1 sendNext:@"弄啥嘞"];
第二種:訂閱最新的信號
RACSubject * subjectOfSignal = [RACSubject subject];
RACSubject * subject1 = [RACSubject subject];
[subjectOfSignal.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subjectOfSignal sendNext:subject1];
[subject1 sendNext:@"弄啥嘞"];
現(xiàn)在又多一種:
RACSubject * subjectOfSignal = [RACSubject subject];
RACSubject * subject1 = [RACSubject subject];
[[subjectOfSignal flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
return value;
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subjectOfSignal sendNext:subject1];
[subject1 sendNext:@"弄啥嘞"];