RAC - 映射(Map & flattenMap)

文章系列
《ReactiveCocoa 概述》
《RACSignal》
《RACDisposable》
《RACSubject草戈、RACReplaySubject(內(nèi)附冷信號和熱信號的區(qū)別)》
《集合RACTuple侍瑟、RACSequence》
《RAC 中的通知、代理涨颜、KVO, 基本事件、方法的監(jiān)聽》
《rac_liftSelector》
《RACMulticastConnection》
《RACCommand》
《RAC - 核心方法bind》
《RAC - 定時器》
《RACScheduler》
《RAC - 點擊獲取驗證碼 demo》
《RAC - 映射(Map & flattenMap)》
《RAC信號操作解釋合集》
《RAC - 信號的生命周期》

flattenMapMap 都用于把源信號內(nèi)容映射成新的內(nèi)容.

flattenMap

作用: 用于信號中信號,把源信號的內(nèi)容映射成一個新的信號,信號可以是任意類型

flattenMap使用步驟:

  • 傳入一個block, block 類型是返回值RACStream,參數(shù)value.
  • 參數(shù)value 就是源信號的內(nèi)容, 拿到源信號的內(nèi)容做處理.
  • 包裝成RACReturnSignal 信號,返回出去.
- (void)flatteMapTest {
    
    // 創(chuàng)建信號
    RACSubject *subject = [RACSubject subject];
    
    // 綁定信號
    RACSignal *bindSignal = [subject flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        
        // value: 源信號發(fā)送的內(nèi)容
        value = [NSString stringWithFormat:@"flattenMap 后的信號:%@", value];
        
        // 返回的信號:用來包裝成修改內(nèi)容值
        return [RACReturnSignal return:value];
    }];
                             
    // flattenMap中返回的是什么信號,訂閱的就是什么信號
    // 訂閱信號
    [bindSignal subscribeNext:^(id x) {
        
        NSLog(@"%@", x);
    }];
    
    // 發(fā)送數(shù)據(jù)
    [subject sendNext:@1];
}
打印結(jié)果

flattenMap底層實現(xiàn):

  1. flattenMap內(nèi)部調(diào)用bind方法實現(xiàn)的, flattenMapblock的返回值,會作為bindbindBlock的返回值.
  2. 當(dāng)訂閱綁定信號,就會生成bindBlock.
  3. 當(dāng)源信號發(fā)送內(nèi)容,就會調(diào)用bindBlock(value, *stop).
  4. 調(diào)用bindBlock, 內(nèi)部就會調(diào)用flattenMapblock, flattenMapblock作用:就是把處理好的數(shù)據(jù)包裝成信號.
  5. 返回的信號最終會作為bindBlock中的返回信號,當(dāng)做bindBlock的返回信號.
  6. 訂閱bindBlock的返回信號,就會拿到綁定信號的訂閱者,把處理完成的信號內(nèi)容發(fā)送出來.
- (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))block {
    Class class = self.class;

    return [[self bind:^{
        return ^(id value, BOOL *stop) {
            id stream = block(value) ?: [class empty];
            NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream);

            return stream;
        };
    }] setNameWithFormat:@"[%@] -flattenMap:", self.name];
}

Map

作用: 把源信號的值映射成一個新的值

Map使用步驟:

  • 傳入一個block, 類型是返回對象, 參數(shù)是value.
  • value 就是源信號的內(nèi)容,直接拿到源信號的內(nèi)容做處理.
  • 把處理好的內(nèi)容,直接返回就好了,不用包裝成信號,返回的值,就是映射的值.
- (void)mapTest {
    
    RACSubject *subject = [RACSubject subject];
    
    RACSignal *Signal = [subject map:^id _Nullable(NSNumber *value) {
        
        value = @(value.integerValue + 1);
        return value;
    }];
    
    [Signal subscribeNext:^(id  _Nullable x) {
       
        NSLog(@"%@", x);
    }];
    
    [subject sendNext:@1];
}

信號subject發(fā)送的是1, 但是Map內(nèi)部的操作是將所有發(fā)送的值做加一操作, 多以打印結(jié)果為2

打印結(jié)果

Map底層實現(xiàn):

  1. Map底層其實是調(diào)用flatternMap,Mapblock中的返回的值會作為flatternMapblock中的值.
  2. 當(dāng)訂閱綁定信號, 就會生成bindBlock.
  3. 當(dāng)源信號發(fā)送內(nèi)容,就會調(diào)用bindBlock(value, *stop).
    4.調(diào)用bindBlock,內(nèi)部就會調(diào)用flattenMapblock.
  4. flattenMapblock內(nèi)部會調(diào)用Map中的block,把Map中的block返回的內(nèi)容包裝成返回的信號.
  5. 返回的信號最終會作為bindBlock中的返回信號,當(dāng)做bindBlock的返回信號.
  6. 訂閱bindBlock的返回信號,就會拿到綁定信號的訂閱者,把處理完成的信號內(nèi)容發(fā)送出來.

FlatternMap和Map的區(qū)別

1. FlatternMap 中的Block 返回信號.
2. Map 中的Block 返回對象.
3. 開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map.
4. 開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap.

FlatternMap直接處理信號中的信號示例:

- (void)flattenMapTest2{

    RACSubject *signalOfsignals = [RACSubject subject];
    
    RACSubject *signal1 = [RACSubject subject];
    RACSubject *signal2 = [RACSubject subject];

    [[signalOfsignals flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        
        // 當(dāng)signalOfsignals的signals發(fā)出信號才會調(diào)用
        return value;
    }] subscribeNext:^(id  _Nullable x) {
        
        // 只有signalOfsignals 的signal 發(fā)出信號才會調(diào)用,
        // 也就是flattenMap返回的信號(上面的value)發(fā)出內(nèi)容损痰,才會調(diào)用酒来。
        NSLog(@"x=%@",x);
    }];
      
    // 信號的信號發(fā)送信號
    [signalOfsignals sendNext:signal1];
    [signalOfsignals sendNext:signal2];

    // 信號發(fā)送內(nèi)容
    [signal1 sendNext:@1];
    [signal1 sendNext:@2];
    [signal2 sendNext:@3];
}
打印結(jié)果
注:

高階信號使用switchToLatest , 關(guān)注的是高階信號中的最后一個信號.
高階信號使用flattenMap, 是把整個高階信號扁平化, 得到一個低階信號.

.End

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伟墙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戳葵,老刑警劉巖拱烁,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏自,死亡現(xiàn)場離奇詭異邦投,居然都是意外死亡擅笔,警方通過查閱死者的電腦和手機屯援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門狞洋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徘铝,你說我怎么就攤上這事惯吕。” “怎么了废登?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甲锡。 經(jīng)常有香客問我羽戒,道長,這世上最難降的妖魔是什么易稠? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮企量,結(jié)果婚禮上亡电,老公的妹妹穿的比我還像新娘届巩。我一直安慰自己份乒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布瘾英。 她就那樣靜靜地躺著孝凌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟀架。 梳的紋絲不亂的頭發(fā)上榆骚,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天煌集,我揣著相機與錄音,去河邊找鬼碉钠。 笑死,一個胖子當(dāng)著我的面吹牛喊废,可吹牛的內(nèi)容都是我干的栗弟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓣蛀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惋增?” 一聲冷哼從身側(cè)響起改鲫,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钩杰,沒想到半個月后诊县,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡避除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年胸嘁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片群井。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫胜,死狀恐怖诬辈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焙糟,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布痪欲,位于F島的核電站业踢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陨亡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欲账,春花似錦赛不、人聲如沸踢故。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至本涕,卻和暖如春偏友,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氛濒。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窿冯,地道東北人醒串。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓仰挣,卻偏偏與公主長得像膘壶,于是被迫代替她去往敵國和親洲愤。 傳聞我的和親對象是個殘疾皇子柬赐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355