緊跟上一篇的內(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ù)
如果我們使用NSData
的rac_readContentsOfURL:url
方法下載的是一張圖片组底,我們肯定希望這個(gè)Signal最后輸出的是UIImage
對象,這里就要用到非常常用的map
函數(shù)炼邀。
map
函數(shù)就像signal
管道上的中間處理器捞蚂,從這里走過的signal
都會(huì)經(jīng)過一段處理后,變成新的signal
繼續(xù)傳輸。而這個(gè)處理過程則在map
函數(shù)中由開發(fā)者決定跳昼。
將輸出NSData
的signal
轉(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ò)展舀患。