nsdata + racsupport.h
@inte***ce nsdata (racsupport)
// read the data at the url using -[nsdata initwithcontentsofurl:options:error:].
// sends the data or the error.
// 返回乙個url非同步請求的訊號量
// scheduler 不能為空
+ (racsignal *)rac_readcontentsofurl:(nsurl *)url options:(nsdatareadingoptions)options scheduler:(racscheduler *)scheduler;
@end
可以這樣用
nsurl* url = [nsurl urlwithstring:@""];
racsignal* getdatasignal = [nsdata rac_readcontentsofurl:url options:nsdatareadinguncached
scheduler:[racscheduler mainthreadscheduler]];
[getdatasignal subscribenext:^(id x) ];
map
函式就像signal
管道上的中間處理器,從這裡走過的signal
都會經過一段處理後,變成新的signal
繼續傳輸。而這個處理過程則在map
函式中由開發者決定。
將輸出nsdata
的signal
轉換為輸出uiimage
nsurl* url = [nsurl urlwithstring:@""];
racsignal* getdatasignal = [nsdata rac_readcontentsofurl:url options:nsdatareadinguncached
scheduler:[racscheduler mainthreadscheduler]];
//map函式進行轉換
racsignal* getimagesignal = [getdatasignal map:^id(id value)
return nil;
}];
[getimagesignal subscribenext:^(id x) ];
接著我們提出乙個新需求,同時請求三張不同的,並將它們傳送的訊號合併成一條訊號量。這裡就需要用到訊號量的merge
方法,如下
nsurl* url = [nsurl urlwithstring:@""];
nsurl* url2 = [nsurl urlwithstring:@""];
nsurl* url3 = [nsurl urlwithstring:@""];
racsignal* getimagesignal1 = [[nsdata rac_readcontentsofurl:url
options:nsdatareadinguncached
scheduler:[racscheduler mainthreadscheduler]]
map:^id(id value)
return nil;
}];
racsignal* getimagesignal2 = [[nsdata rac_readcontentsofurl:url2
options:nsdatareadinguncached
scheduler:[racscheduler mainthreadscheduler]]
map:^id(id value)
return nil;
}];racsignal* getimagesignal3 = [[nsdata rac_readcontentsofurl:url3
options:nsdatareadinguncached
scheduler:[racscheduler mainthreadscheduler]]
map:^id(id value)
return nil;
}];//合併操作
racsignal* mergesignal = [racsignal merge:@[getimagesignal1,getimagesignal2,getimagesignal3]];
[mergesignal subscribenext:^(id x) ];```
輸出如下:
2015-12-30 10:19:08.776 fahu[1354:39991] ,
2015-12-30 10:19:08.891 fahu[1354:39991] ,
2015-12-30 10:19:09.098 fahu[1354:39991] ,
###filter函式
網路也會有連不上的時候,三張中如果有哪一張請求失敗,我們並不想讓`signal`傳送`nil`值過來,可以使用filter函式對`signal`進行篩選。稍微改造一下上面的`mergesignal`:
racsignal* mergesignal = [[racsignal merge:@[getimagesignal1,getimagesignal2,getimagesignal3]] filter:^bool(id value) ];`
注意這裡的filter函式返回的是nsnumber型的bool值,yes是通過,no時拒絕通過。
有了rac
,一些簡單的網路請求都可以不用af框架了。
nsurlconnection+racsupport.h
+ (racsignal *)rac_sendasynchronousrequest:(nsurlrequest *)request;```
舉個例子,還是請求
nsurl* url = [nsurl urlwithstring:@""];
nsurlrequest* request = [nsurlrequest requestwithurl:url];
racsignal* connectionsignal = [nsurlconnection rac_sendasynchronousrequest:request];
[connectionsignal subscribenext:^(id x) ];`
輸出
...省略```
注意,這個`signal`傳送的訊號量是乙個`ractuple`物件。
###ractuple
`ractuple`(元組)類,是`rac`中專門用來返回多個返回值的類,這個設計很像swift中的元組。
上面例子中的`ractuple`有兩個返回值,`x[0]`是http response的頭部資訊,`x[1]`是請求返回的資料,是乙個`nsdata`物件。元組類物件的讀取方法和陣列相同。
C 一些常用用法
static cast c 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。用於四種方式 用於類層次結構中基類 父類 和派生類 子類 之間指標或引用的轉換。進行上行轉換 把派生類的指標或引用轉換成基類表示 是安全的 進行下行轉換 把基類指標或引用轉換成...
const的一些常用用法
const的一些常用用法 一 類中成員函式後面加上const void function const 類中的成員函式 或者在類中先宣告,然後在類外定義,如下所示 void function const void a function const 對上述相關函式做如下三點說明 首先,此函式不能對類中的...
C 中一些字串操作的常用用法
獲得漢字的區位碼 byte array new byte 2 array system.text.encoding.default.getbytes 啊 int i1 short array 0 0 int i2 short array 1 0 unicode解碼方式下的漢字碼 array syst...