ReactiveCocoa入門到實戰(zhàn) 學(xué)習(xí)筆記(二)

信號的高階操作


內(nèi)容大綱

  • 信號的高階操作

信號的高階操作

  1. 升階和降階
    我們可以將一個返回 Value 的信號升階成一個返回 Signal 的信號,這種行為稱之為升階
    我們也可以將一個返回 Signal 的信號降階成一個返回 Value 的信號务豺,這種行為稱之為降階
    // 升階
    RACSignal *arraySignal = [@[@1, @2, @3, @4, @5, @6, @8, @10, @0].rac_sequence.signal map:^RACStream *(id value) {
        
        return [RACSignal return:value];
    }];

    // 降階
    [[arraySignal flatten] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
  1. 降階操作
  • switchToLatests
    RACSignal *signal1 = [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] mapReplace:[RACSignal return:@1]];
    
    RACSignal *signal4 = [RACSignal return:signal1];
    
    RACSignal *signal2 = [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] mapReplace:[RACSignal return:@"hello"]];
    
    RACSignal *signal3 = [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] mapReplace:signal2];
    
    [[[[signal4 merge:signal3] switchToLatest] flatten] subscribeNext:^(id x) {
       
        NSLog(@"%@", x);
    }];

signal4 是一個包含了一個定時器信號的信號,signal3 是按鈕的點擊事件觸發(fā)长踊,也包含的是一個定時器信號赛不,當(dāng)點擊按鈕時,原本定時打印1的結(jié)果改變?yōu)槎〞r打印hello。switchLatests表示纹笼,當(dāng)下一個信號來臨時,取消前一個信號的訂閱苟跪,轉(zhuǎn)而訂閱下一個信號廷痘。

  • If/then/else
    RACSignal *ifSignal = [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] scanWithStart:@YES reduce:^id(id running, id next) {
        
        return [running boolValue] ? @NO : @YES;
    }];
    
    RACSignal *yesSignal = [RACSignal return:@"YES"];
    RACSignal *noSignal = [RACSignal return:@"NO"];
    
    [[RACSignal if:ifSignal then:yesSignal else:noSignal] subscribeNext:^(id x) {
       
        NSLog(@"%@", x);
    }];
    
    /*
     2021-08-04 16:40:22.179744+0800 RACTestOne[38424:1864836] NO
     2021-08-04 16:40:23.061356+0800 RACTestOne[38424:1864836] YES
     2021-08-04 16:40:23.751064+0800 RACTestOne[38424:1864836] NO
     2021-08-04 16:40:24.335030+0800 RACTestOne[38424:1864836] YES
     2021-08-04 16:40:24.862587+0800 RACTestOne[38424:1864836] NO
     2021-08-04 16:40:25.186937+0800 RACTestOne[38424:1864836] YES
     2021-08-04 16:40:25.495577+0800 RACTestOne[38424:1864836] NO
     */
  • switch/case
    根據(jù)switch訂閱對應(yīng)的signal
    RACSignal *swithSignal_1 = [RACSignal return:@"1"];
    RACSignal *swithSignal_2 = [RACSignal return:@"2"];
    RACSignal *swithSignal_3 = [RACSignal return:@"3"];
    
    [[RACSignal switch:swithSignal_1 cases:@{@"1": swithSignal_2} default:swithSignal_3] subscribeNext:^(id x) {
       
        NSLog(@"%@", x);
    }];
    
    /*
     2021-08-04 16:44:57.056471+0800 RACTestOne[38484:1868134] 3
     */
  • flatten
    根據(jù)時間將多個信號異步執(zhí)行
    RACSignal *signal1 = [[[[[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] scanWithStart:@0 reduce:^id(id running, id next) {
        
        return @([running integerValue] + 2);
    }] take:5] map:^id(id value) {
        return [RACSignal return:value];
    }] delay:1];
    
    RACSignal *signal2 = [[[[RACSignal interval:2 onScheduler:[RACScheduler scheduler]] scanWithStart:@(-1) reduce:^id(id running, id next) {
        
        return @([running integerValue] + 2);
    }] take:5] map:^id(id value) {
        return [RACSignal return:value];
    }];
    
    [[[signal1 merge:signal2] flatten] subscribeNext:^(id x) {
       
        NSLog(@"%@ -- %@", x, [NSThread currentThread]);
    } completed:^{
        NSLog(@"finished");
    }];
    
    /*
     2021-08-04 16:52:48.891416+0800 RACTestOne[38662:1875819] 1 -- <NSThread: 0x600000321540>{number = 6, name = (null)}
     2021-08-04 16:52:49.983304+0800 RACTestOne[38662:1875744] 2 -- <NSThread: 0x600000364780>{number = 1, name = main}
     2021-08-04 16:52:50.891148+0800 RACTestOne[38662:1875812] 3 -- <NSThread: 0x60000032e0c0>{number = 7, name = (null)}
     2021-08-04 16:52:51.991282+0800 RACTestOne[38662:1875744] 4 -- <NSThread: 0x600000364780>{number = 1, name = main}
     2021-08-04 16:52:52.890137+0800 RACTestOne[38662:1875817] 5 -- <NSThread: 0x600000321000>{number = 3, name = (null)}
     2021-08-04 16:52:53.923718+0800 RACTestOne[38662:1875744] 6 -- <NSThread: 0x600000364780>{number = 1, name = main}
     2021-08-04 16:52:54.890292+0800 RACTestOne[38662:1875819] 7 -- <NSThread: 0x600000321540>{number = 6, name = (null)}
     2021-08-04 16:52:55.966818+0800 RACTestOne[38662:1875744] 8 -- <NSThread: 0x600000364780>{number = 1, name = main}
     2021-08-04 16:52:56.891232+0800 RACTestOne[38662:1875817] 9 -- <NSThread: 0x600000321000>{number = 3, name = (null)}
     2021-08-04 16:52:57.951822+0800 RACTestOne[38662:1875744] 10 -- <NSThread: 0x600000364780>{number = 1, name = main}
     2021-08-04 16:52:57.952246+0800 RACTestOne[38662:1875744] finished
     */
  • flattenMap
    等于先map,后flatten件已,信號的返回值必須是一個信號笋额,訂閱的時候會被降階成一個值,等于先使用map篷扩,后使用flatten
  • try
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兄猩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枢冤,老刑警劉巖鸠姨,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淹真,居然都是意外死亡讶迁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門核蘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巍糯,“玉大人,你說我怎么就攤上這事客扎∷盥停” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵虐唠,是天一觀的道長搀愧。 經(jīng)常有香客問我,道長疆偿,這世上最難降的妖魔是什么咱筛? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮杆故,結(jié)果婚禮上迅箩,老公的妹妹穿的比我還像新娘。我一直安慰自己处铛,他們只是感情好饲趋,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撤蟆,像睡著了一般奕塑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上家肯,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天龄砰,我揣著相機與錄音,去河邊找鬼讨衣。 笑死换棚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的反镇。 我是一名探鬼主播固蚤,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歹茶!你這毒婦竟也來了夕玩?” 一聲冷哼從身側(cè)響起你弦,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎风秤,沒想到半個月后鳖目,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缤弦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年领迈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍沐。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸捅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出累提,到底是詐尸還是另有隱情尘喝,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布斋陪,位于F島的核電站朽褪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏无虚。R本人自食惡果不足惜缔赠,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望友题。 院中可真熱鬧嗤堰,春花似錦、人聲如沸度宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈抄。三九已至离唬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間划鸽,已是汗流浹背男娄。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漾稀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓建瘫,卻偏偏與公主長得像崭捍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啰脚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349