RACSignal的一些常用用法(二)

上一篇一些常用的RACSignal

緊跟上一篇的內(nèi)容,我們來用一些例子讓大家更深刻地理解RACSignal

NSData

嘗試這個(gè)例子之前泻拦,請?jiān)贒emo工程的info.plist文件中加入App Transport Security Settings鍵值襟锐,并加入Allow Arbitrary Loads:YES鍵值對,用來開啟iOS下的非安全連接娄柳。

NSData + RACSupport.h

@interface NSData (RACSupport)

// Read the data at the URL using -[NSData initWithContentsOfURL:options:error:].
// Sends the data or the error.
// 返回一個(gè)URL異步請求的信號(hào)量
// scheduler 不能為空
+ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler;

@end

可以這樣用

NSURL* url = [NSURL URLWithString:@"http://www.reibang.com"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
                                       scheduler:[RACScheduler mainThreadScheduler]];
[getDataSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);  //這里的x就是NSData數(shù)據(jù)
}];

map函數(shù)

如果我們使用NSDatarac_readContentsOfURL:url方法下載的是一張圖片组底,我們肯定希望這個(gè)Signal最后輸出的是UIImage對象,這里就要用到非常常用的map函數(shù)炼邀。

map函數(shù)就像signal 管道上的中間處理器捞蚂,從這里走過的signal都會(huì)經(jīng)過一段處理后,變成新的signal繼續(xù)傳輸。而這個(gè)處理過程則在map函數(shù)中由開發(fā)者決定跳昼。

將輸出NSDatasignal轉(zhuǎn)換為輸出UIImage

NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
                                       scheduler:[RACScheduler mainThreadScheduler]];
    
//map函數(shù)進(jìn)行轉(zhuǎn)換
RACSignal* getImageSignal = [getDataSignal map:^id(id value) {
        if (value) {
            return [UIImage imageWithData:value];
        }
        return nil;
}];
    
[getImageSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];

merge方法

接著我們提出一個(gè)新需求般甲,同時(shí)請求三張不同的圖片,并將它們發(fā)送的信號(hào)合并成一條信號(hào)量鹅颊。這里就需要用到信號(hào)量的merge方法敷存,如下

NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
NSURL* url2 = [NSURL URLWithString:@"http://i3.hoopchina.com.cn/blogfile/201306/29/137247593017986.jpg"];
NSURL* url3 = [NSURL URLWithString:@"http://img.youxile.com/pic/1301/25170237170.jpg"];
RACSignal* getImageSignal1 = [[NSData rac_readContentsOfURL:url
                                                       options:NSDataReadingUncached
                                                     scheduler:[RACScheduler mainThreadScheduler]]
                                 map:^id(id value) {
        if (value) {
            return [UIImage imageWithData:value];
        }
        return nil;
}];
    
RACSignal* getImageSignal2 = [[NSData rac_readContentsOfURL:url2
                                                        options:NSDataReadingUncached
                                                      scheduler:[RACScheduler mainThreadScheduler]]
                                  map:^id(id value) {
                                      if (value) {
                                          return [UIImage imageWithData:value];
                                      }
                                      return nil;
                                  }];
    
RACSignal* getImageSignal3 = [[NSData rac_readContentsOfURL:url3
                                                        options:NSDataReadingUncached
                                                      scheduler:[RACScheduler mainThreadScheduler]]
                                  map:^id(id value) {
                                      if (value) {
                                          return [UIImage imageWithData:value];
                                      }
                                      return nil;
                                  }];

                                 
//合并操作
RACSignal* mergeSignal = [RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]];
    
    [mergeSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];```

輸出如下:

2015-12-30 10:19:08.776 Fahu[1354:39991] <UIImage: 0x7f9ce2ac3730>, {450, 600}
2015-12-30 10:19:08.891 Fahu[1354:39991] <UIImage: 0x7f9ce2b02600>, {500, 687}
2015-12-30 10:19:09.098 Fahu[1354:39991] <UIImage: 0x7f9ce29a4500>, {500, 346}


###filter函數(shù)

網(wǎng)絡(luò)也會(huì)有連不上的時(shí)候,三張圖片中如果有哪一張請求失敗堪伍,我們并不想讓`signal`發(fā)送`nil`值過來锚烦,可以使用filter函數(shù)對`signal`進(jìn)行篩選。稍微改造一下上面的`mergeSignal`:

RACSignal* mergeSignal = [[RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]] filter:^BOOL(id value) {
return @(!!value);
}];```

注意這里的filter函數(shù)返回的是NSNumber型的BOOL值帝雇,YES是通過涮俄,NO時(shí)拒絕通過。

NSURLConnection

有了RAC尸闸,一些簡單的網(wǎng)絡(luò)請求都可以不用AF框架了彻亲。

NSURLConnection+RACSupport.h

+ (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request;```

舉個(gè)例子,還是請求圖片

NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
RACSignal* connectionSignal = [NSURLConnection rac_sendAsynchronousRequest:request];
[connectionSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];```

輸出

 <RACTuple: 0x7f826c071c00>  ...省略```

注意吮廉,這個(gè)`signal`發(fā)送的信號(hào)量是一個(gè)`RACTuple`對象苞尝。

###RACTuple

`RACTuple`(元組)類,是`RAC`中專門用來返回多個(gè)返回值的類宦芦,這個(gè)設(shè)計(jì)很像swift中的元組宙址。

上面例子中的`RACTuple`有兩個(gè)返回值,`x[0]`是http response的頭部信息调卑,`x[1]`是請求返回的數(shù)據(jù)抡砂,是一個(gè)`NSData`對象。元組類對象的讀取方法和數(shù)組相同令野。

下一片文章我們接著聊聊`RAC`對`UIKit`進(jìn)行的擴(kuò)展舀患。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市气破,隨后出現(xiàn)的幾起案子聊浅,更是在濱河造成了極大的恐慌,老刑警劉巖现使,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件低匙,死亡現(xiàn)場離奇詭異,居然都是意外死亡碳锈,警方通過查閱死者的電腦和手機(jī)顽冶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來售碳,“玉大人强重,你說我怎么就攤上這事绞呈。” “怎么了间景?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵佃声,是天一觀的道長。 經(jīng)常有香客問我倘要,道長圾亏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任封拧,我火速辦了婚禮志鹃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泽西。我一直安慰自己曹铃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布尝苇。 她就那樣靜靜地躺著铛只,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糠溜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天直撤,我揣著相機(jī)與錄音非竿,去河邊找鬼。 笑死谋竖,一個(gè)胖子當(dāng)著我的面吹牛红柱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓖乘,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼锤悄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘉抒?” 一聲冷哼從身側(cè)響起零聚,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎些侍,沒想到半個(gè)月后隶症,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗宣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年蚂会,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耗式。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胁住,死狀恐怖趁猴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彪见,我是刑警寧澤躲叼,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站企巢,受9級(jí)特大地震影響枫慷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浪规,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一或听、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笋婿,春花似錦誉裆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庇配,卻和暖如春斩跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捞慌。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工耀鸦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啸澡。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓袖订,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗅虏。 傳聞我的和親對象是個(gè)殘疾皇子洛姑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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