RACSignal的一些常用用法(二)

2021-09-19 10:19:04 字數 3578 閱讀 6429

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函式中由開發者決定。

將輸出nsdatasignal轉換為輸出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...