RAC信號(hào)處理

map -- 映射

創(chuàng)建一個(gè)訂閱者的映射并且返回?cái)?shù)據(jù)(例:將textField的字符串轉(zhuǎn)為其本身長(zhǎng)度)

[[self.textField.rac_textSignal map:^id(NSString *value) {
    NSLog(@"%@", value);
    return value.length;
}] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

flattenmap -- 扁平映射(信號(hào)中的信號(hào))

實(shí)際上是根據(jù)前一個(gè)信號(hào)傳遞進(jìn)來(lái)的參數(shù)重新建立了一個(gè)信號(hào)虎敦,這個(gè)參數(shù)肿仑,可能會(huì)在創(chuàng)建信號(hào)的時(shí)候用到奕枝,也有可能根本用不到

- (RACSignal *)signInSignal {
    return [RACSignal createSignal:^RACDisposable *(id subscriber){
        [self.signInService
         signInWithUsername:self.usernameTextField.text
         password:self.passwordTextField.text
         complete:^(BOOL success){
             [subscriber sendNext:@(success)];
             [subscriber sendCompleted];
         }];
        return nil;
    }];
}

    [[[self.signInButton
       rac_signalForControlEvents:UIControlEventTouchUpInside]
      map:^id(id x){
          return [self signInSignal];
      }]
     subscribeNext:^(id x){
         NSLog(@"Sign in result: %@", x);
     }];

此時(shí)當(dāng)我們使用map映射的是一個(gè)信號(hào)(即信號(hào)中的信號(hào))匠题,映射出來(lái)的value是(RACSignal *)期犬,這時(shí)我們subscribeNext的value即為此信號(hào)類(lèi)型溺忧,而不是信號(hào)中的value值微渠;所以這里調(diào)用flattenMap霎苗,創(chuàng)建新的信號(hào)争剿,使用(RACSignal *)的value作為新信號(hào)的value已艰,也就是我們需要的值。

補(bǔ)充

map 與 swtichToLatest結(jié)合類(lèi)似于flattenMap
switchToLatest:選擇最新的信號(hào)的value蚕苇,比如我依次發(fā)送3個(gè)signal哩掺,但是switchToLatest只取第三個(gè)響應(yīng)信號(hào)的value。

filter -- 過(guò)濾

信號(hào)變化時(shí)篩選出需要的信號(hào)(例:當(dāng)textField的字符串長(zhǎng)度大于3時(shí)涩笤,信號(hào)才會(huì)響應(yīng))

[[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
    return value.length > 3;
}] subscribeNext:^(id x) {
    NSLog(@"x = %@", x);
}];

take/skip/repeat -- 獲取/跳過(guò)/重復(fù)

RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"1"];
    [subscriber sendNext:@"2"];
    [subscriber sendNext:@"3"];
    [subscriber sendNext:@"4"];
    [subscriber sendNext:@"5"];
    [subscriber sendCompleted];
    return nil;
}] take:2];

[signal subscribeNext:^(id x) {
    NSLog(@"%@", x);
}completed:^{
    NSLog(@"completed");
}];

這個(gè)signal只會(huì)輸出前兩個(gè)信號(hào)1和2還有完成信號(hào)completed疮丛,skip repeat同理。
相似的還有takeLast takeUntil takeWhileBlock skipWhileBlock skipUntilBlock repeatWhileBlock都可以根據(jù)字面意思來(lái)理解辆它。

distinctUntilChanged

網(wǎng)絡(luò)請(qǐng)求中為了減輕服務(wù)器壓力誊薄,無(wú)用的請(qǐng)求我們應(yīng)該盡可能不發(fā)送。distinctUntilChanged的作用是使RAC不會(huì)連續(xù)發(fā)送兩次相同的信號(hào)锰茉,這樣就解決了這個(gè)問(wèn)題呢蔫。

[[[self.textField rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

ignore -- 忽略

指定一個(gè)任意類(lèi)型的量(可以是字符串,數(shù)組等)飒筑,當(dāng)需要發(fā)送信號(hào)時(shí)講進(jìn)行判斷片吊,若相同則該信號(hào)會(huì)被忽略發(fā)送。

[[[self.textFild rac_textSignal] ignore:@"good"] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

delay -- 延時(shí)

    RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"delay"];
        [subscriber sendCompleted];
        return nil;
    }] delay:2];
    
    NSLog(@"tag");
    
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

throttle --節(jié)流

在我們做搜索框的時(shí)候协屡,有時(shí)候需求的時(shí)實(shí)時(shí)搜索俏脊,即用戶(hù)每每輸入字符,view都要求展現(xiàn)搜索結(jié)果肤晓。這時(shí)如果用戶(hù)搜索的字符串較長(zhǎng)爷贫,那么由于網(wǎng)絡(luò)請(qǐng)求的延時(shí)可能造成UI顯示錯(cuò)誤认然,并且多次不必要的請(qǐng)求還會(huì)加大服務(wù)器的壓力,這顯然是不合理的漫萄,此時(shí)我們就需要用到節(jié)流卷员。

[[[self.textFild rac_textSignal] throttle:0.5] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

加了節(jié)流管道,后面跟上了類(lèi)型為NSTimeInterval的參數(shù)后腾务,只有0.5S內(nèi)信號(hào)不產(chǎn)生變化才會(huì)發(fā)送請(qǐng)求毕骡,這樣快速的輸入也不會(huì)造成多次輸出。

timeout -- 超時(shí)信號(hào)

當(dāng)超出限定時(shí)間后會(huì)給訂閱者發(fā)送error信號(hào)岩瘦。

RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{
            [subscriber sendNext:@"delay"];
            [subscriber sendCompleted];
        }];
        return nil;
    }] timeout:2 onScheduler:[RACScheduler mainThreadScheduler]];
    
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    } error:^(NSError *error) {
        NSLog(@"%@", error);
    }];

由于在創(chuàng)建信號(hào)是限定了延遲3秒發(fā)送未巫,但是加了timeout2秒的限定,所以這一定是一個(gè)超時(shí)信號(hào)启昧。這個(gè)信號(hào)被訂閱后橱赠,由于超時(shí),不會(huì)執(zhí)行訂閱成功的輸出x方法箫津,而是跳到error的塊輸出了錯(cuò)誤信息狭姨。timeout在用RAC封裝網(wǎng)絡(luò)請(qǐng)求時(shí)可以節(jié)省不少的代碼量。

參考自 【cbsfly的博客】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苏遥,一起剝皮案震驚了整個(gè)濱河市饼拍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌田炭,老刑警劉巖师抄,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異教硫,居然都是意外死亡叨吮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)瞬矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茶鉴,“玉大人,你說(shuō)我怎么就攤上這事景用『#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵伞插,是天一觀的道長(zhǎng)割粮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媚污,這世上最難降的妖魔是什么舀瓢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮耗美,結(jié)果婚禮上京髓,老公的妹妹穿的比我還像新娘航缀。我一直安慰自己,他們只是感情好朵锣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甸私,像睡著了一般诚些。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皇型,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天诬烹,我揣著相機(jī)與錄音,去河邊找鬼弃鸦。 笑死绞吁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唬格。 我是一名探鬼主播家破,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼购岗!你這毒婦竟也來(lái)了汰聋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喊积,失蹤者是張志新(化名)和其女友劉穎烹困,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乾吻,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡髓梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绎签。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枯饿。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诡必,靈堂內(nèi)的尸體忽然破棺而出鸭你,到底是詐尸還是另有隱情,我是刑警寧澤擒权,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布袱巨,位于F島的核電站,受9級(jí)特大地震影響碳抄,放射性物質(zhì)發(fā)生泄漏愉老。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一剖效、第九天 我趴在偏房一處隱蔽的房頂上張望嫉入。 院中可真熱鬧焰盗,春花似錦、人聲如沸咒林。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垫竞。三九已至澎粟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欢瞪,已是汗流浹背活烙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遣鼓,地道東北人啸盏。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骑祟,于是被迫代替她去往敵國(guó)和親回懦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容