RACComand 封裝網(wǎng)絡(luò)請求

RACCommand 接口中的高階信號

每一個(gè)RACCommand對象中都管理著多個(gè)信號,它在接口中暴露出的四個(gè)信號是這一節(jié)關(guān)注的重點(diǎn):

RACCommand 中的信號

executionSignals是RACCommand中最重要的信號;從類型來看,它是一個(gè)包含信號的信號,在每次執(zhí)行-execute:方法時(shí),最終都會(huì)向executionSignals中傳入一個(gè)最新的信號。


http://draveness.me/raccommand.html

executing是一個(gè)表示當(dāng)前是否有任務(wù)執(zhí)行的信號,這個(gè)信號使用了在上一節(jié)中介紹的臨時(shí)變量作為數(shù)據(jù)源:

enabled信號流表示當(dāng)前的命令是否可以再次被執(zhí)行,也就是-execute:方法能否可以成功執(zhí)行新的任務(wù)

錯(cuò)誤信號是RACCommand中比較簡單的信號;為了保證RACCommand對此執(zhí)行-execute:方法也可以繼續(xù)運(yùn)行,我們只能將所有的錯(cuò)誤以其它的形式發(fā)送到errors信號中,防止向executionSignals發(fā)送錯(cuò)誤信號后,executionSignals信號就會(huì)中止的問題。

RACCommand 的使用

RACCommand非常適合封裝網(wǎng)絡(luò)請求,我們可以使用下面的代碼封裝一個(gè)網(wǎng)絡(luò)請求

RACCommand*command=[[RACCommand alloc]initWithSignalBlock:^RACSignal*_Nonnull(id? _Nullable input){return[RACSignal createSignal:^RACDisposable*_Nullable(id_Nonnull subscriber){NSURL*url=[NSURL URLWithString:@"http://localhost:3000"];AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc]initWithBaseURL:url];NSString*URLString=[NSString stringWithFormat:@"/api/products/%@",input?:@1];NSURLSessionDataTask*task=[manager GET:URLString parameters:nil progress:nil? ? ? ? ? ? success:^(NSURLSessionDataTask*_Nonnull task,id _Nullable responseObject){[subscriber sendNext:responseObject];[subscriber sendCompleted];}failure:^(NSURLSessionDataTask*_Nullable task,NSError*_Nonnull error){[subscriber sendError:error];}];return[RACDisposable disposableWithBlock:^{[task cancel];}];}];}];

上面的RACCommand對象可以通過-execute:方法執(zhí)行,同時(shí),訂閱executionSignals以及errors來獲取網(wǎng)絡(luò)請求的結(jié)果。

[[command.executionSignals switchToLatest]subscribeNext:^(id? _Nullable x){NSLog(@"%@",x);}];

[command.errors subscribeNext:^(NSError*_Nullable x){NSLog(@"%@",x);}];[command execute:@1];

向方法-execute:中傳入了@1對象,從服務(wù)器中獲取了id = 1的商品對象;當(dāng)然,我們也可以傳入不同的id來獲取不同的模型,所有的網(wǎng)絡(luò)請求以及 JSON 轉(zhuǎn)換模型的邏輯都可以封裝到這個(gè)RACCommand的 block 中,外界只是傳入一個(gè)id,最后就從executionSignals信號中獲取了開箱即用的對象。


總結(jié)

使用RACCommand能夠優(yōu)雅地將包含副作用的操作和與副作用無關(guān)的操作分隔起來;整個(gè)RACCommand相當(dāng)于一個(gè)黑箱,從-execute:方法中獲得輸入,最后以向信號發(fā)送消息的方式,向訂閱者推送結(jié)果。


RACCommand?

這種執(zhí)行任務(wù)的方式就像是一個(gè)函數(shù),根據(jù)輸入的不同,有著不同的輸出,非常適合與 UI、網(wǎng)絡(luò)操作的相關(guān)的任務(wù),這也是RACCommand的設(shè)計(jì)的優(yōu)雅之處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容