iOS實(shí)錄2:淺談iOS的網(wǎng)絡(luò)組件

[這是第二篇]

導(dǎo)語:去年中旬隅俘,為了精簡(jiǎn)網(wǎng)絡(luò)層的工作,為業(yè)務(wù)定制了一個(gè)iOS的網(wǎng)絡(luò)組件笤喳。這套組件頑強(qiáng)地在線上跑了大半年为居,沒犯什么錯(cuò)(謝天謝地,否者就真的是ZUO DIE -> GO DIE)杀狡。

一蒙畴、背景

a、原先的網(wǎng)絡(luò)層組件從別的項(xiàng)目借鑒來的呜象。網(wǎng)絡(luò)組件中耦合些和我們無關(guān)的業(yè)務(wù)膳凝,使用起來代碼寫好長(zhǎng),簡(jiǎn)單定義一個(gè)請(qǐng)求大概需要100行左右恭陡,處理起來也是比較辛苦
b蹬音、大家做網(wǎng)絡(luò)數(shù)據(jù)落地處理的方式,沒有統(tǒng)一的方式(通知休玩,代理等,就是不使用block)
c著淆、AFNetworking3.0當(dāng)時(shí)出來好長(zhǎng)一段時(shí)間了劫狠,很多app網(wǎng)絡(luò)層面臨了網(wǎng)絡(luò)組件的替換可能
d、主要還是用得太辛苦牧抽,想借著AFNetworking3.0的東風(fēng)嘉熊,來好好升級(jí)一下網(wǎng)絡(luò)組件

二、業(yè)務(wù)目標(biāo)

在一個(gè)app開發(fā)中扬舒,設(shè)計(jì)iOS的網(wǎng)絡(luò)組件阐肤,需要考慮業(yè)務(wù)中實(shí)際遇到的需求。
1) post請(qǐng)求還是get請(qǐng)求
2) 普通數(shù)據(jù)請(qǐng)求 && 分頁數(shù)據(jù)請(qǐng)求讲坎,前者就是數(shù)據(jù)的一次性買賣孕惜,后者是連續(xù)不斷請(qǐng)求分頁數(shù)據(jù)
3) 連續(xù)的重復(fù)請(qǐng)求處理 (下拉刷新等場(chǎng)景下)
4) 請(qǐng)求簽名(請(qǐng)求數(shù)據(jù)的MD5校驗(yàn))
5) Cookie的處理(主要包含登錄用戶的標(biāo)識(shí)信息)
6) 統(tǒng)一的數(shù)據(jù)回調(diào)處理 (block處理)
7) 請(qǐng)求數(shù)據(jù)的緩存策略

三、業(yè)務(wù)使用

3.1晨炕、一般網(wǎng)絡(luò)數(shù)據(jù)返回格式協(xié)議
 {
    "code": 0,
    "msg": "ok",
    "data": ...
}
  • code描述的的是服務(wù)器返回請(qǐng)求的狀態(tài)碼衫画,code為0時(shí),表示請(qǐng)求成功瓮栗,msg是狀態(tài)碼描述削罩。請(qǐng)求成功對(duì)應(yīng)ok。code為非0時(shí)候费奸,msg描述的就是錯(cuò)誤信息弥激。
  • data對(duì)應(yīng)的內(nèi)容封裝的是返回的請(qǐng)求數(shù)據(jù),數(shù)據(jù)可以是數(shù)組(分頁請(qǐng)求中)愿阐,數(shù)據(jù)可以是字典結(jié)構(gòu)(一般請(qǐng)求微服,如詳情頁請(qǐng)求)
  • 返回的網(wǎng)絡(luò)數(shù)據(jù)可以解析成model,本質(zhì)是JSON轉(zhuǎn)Model缨历,這部分工作可以交給第三方庫JSONModel或YYModel以蕴,然后把數(shù)據(jù)model交給業(yè)務(wù)層去使用。
3.2辛孵、普通請(qǐng)求(非分頁)的處理

1) 初始化請(qǐng)求

  + (QCBaseRequest *)normalRequestWithUrl:(NSString *)urlString
                               parameters:(nullable NSDictionary *)parameters
                        requestMethodType:(QCRequestMethodType)requestMethodType

2) 發(fā)出請(qǐng)求

 - (void)startWithCompleteBlock:(QCRequestCompleteBlock)completeBlock;;

3) 使用

self.request = [QCBaseRequest normalRequestWithUrl:urlString parameters:nil requestMethodType:QCRequestMethodTypeGET];
[self.request startWithCompleteBlock:^(BOOL isSuccess, id  _Nullable responseObj, NSString * _Nonnull errorDesc) {    
    NSLog(@"isSuccess = %d && errorDesc = %@",isSuccess,errorDesc);
    //TODO 數(shù)據(jù)解析....
    
}];
3.3丛肮、分頁請(qǐng)求的處理
  • 在app中,通常列表頁都支持分頁請(qǐng)求魄缚。請(qǐng)求中添加page和pagesize的參數(shù)值(pagesize一般是固定的)宝与,然后服務(wù)器根據(jù)相關(guān)信息返回對(duì)應(yīng)頁的數(shù)據(jù)。

1) 初始化請(qǐng)求

 + (QCBaseRequest *)pagingRequestWithMethodType:(QCRequestMethodType)requestMethodType
                                parameters:(nullable NSDictionary *)parameters;

2)使用

- (void)startPagingRequestUrl:(NSString *)urlString
            completeBlock:(QCPageRequestCompleteBlock)completeBlock

3) 使用

[self.pagingRequest startPagingRequestUrl:urlString completeBlock:^(BOOL isSuccess, BOOL hasMoreData, BOOL isReset, id  _Nullable dataArray, NSString * _Nonnull errorDesc) {
    
    NSLog(@"isSuccess = %d && hasMoreData = %d && isReset = %d",isSuccess,hasMoreData,isReset);
    NSLog(@"&& errorDesc = %@",errorDesc);
}];
3.4鲜滩、取消請(qǐng)求
  • 取消請(qǐng)求的操作還是很有必要的伴鳖。主要是處于以下兩個(gè)原因:
  • 一個(gè)是考慮安全。如在Controller了中發(fā)出請(qǐng)求徙硅,請(qǐng)求沒有返回這段時(shí)間內(nèi)榜聂,用戶點(diǎn)擊去了另一個(gè)Controller,或者退出了當(dāng)前的Controller嗓蘑,請(qǐng)求還未回來须肆,一旦系統(tǒng)回收了這個(gè)Controller匿乃,數(shù)據(jù)落地Controller無法處理,這樣就埋下了隱患豌汇。
  • 另一個(gè)是為了及時(shí)更新請(qǐng)求幢炸。如用戶下拉操作時(shí)候,同樣的請(qǐng)求連續(xù)發(fā)出拒贱,通過取消前一個(gè)請(qǐng)求宛徊,保證最新發(fā)出的請(qǐng)求有效。當(dāng)然我們也可以不取消請(qǐng)求逻澳,檢測(cè)前一個(gè)相同請(qǐng)求沒有落地闸天,后續(xù)相同的請(qǐng)求無效的情況。(我的網(wǎng)絡(luò)組件默認(rèn)是這么做的)

四斜做、總結(jié)

  • 早期苞氮,我們采用的是離散式的網(wǎng)絡(luò)請(qǐng)求API去處理請(qǐng)求(一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)API),這給了我們極大的自由瓤逼,如分頁請(qǐng)求處理等笼吟。但是隨著業(yè)務(wù)增加,請(qǐng)求的類文件越來越多霸旗,冗余的代碼也越來越多贷帮。
  • 雖然我們需要自由,但是在我這一年的開發(fā)中發(fā)現(xiàn)定硝,業(yè)務(wù)中似乎不太需要這種自由皿桑,規(guī)范極大地約束了自由毫目,不需要開發(fā)者太多變化蔬啡。這些規(guī)范目前看來,沒有不好地方(技術(shù)不是為了炫技镀虐,應(yīng)該是更好服務(wù)于業(yè)務(wù)吧箱蟆,"死板"些似乎也沒有錯(cuò))。
  • 網(wǎng)絡(luò)層業(yè)務(wù)組件一直提供離散式的網(wǎng)絡(luò)請(qǐng)求API刮便,現(xiàn)在的集約式請(qǐng)求API正是建立在原來離散式的網(wǎng)絡(luò)請(qǐng)求API的基礎(chǔ)上的空猜。(繞了一大圈又回來了)

源碼直通車 : QSUseNetworkDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨旱,隨后出現(xiàn)的幾起案子辈毯,更是在濱河造成了極大的恐慌,老刑警劉巖搜贤,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆沃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仪芒,警方通過查閱死者的電腦和手機(jī)唁影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門耕陷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人据沈,你說我怎么就攤上這事哟沫。” “怎么了锌介?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵嗜诀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我孔祸,道長(zhǎng)裹虫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任融击,我火速辦了婚禮筑公,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尊浪。我一直安慰自己匣屡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布拇涤。 她就那樣靜靜地躺著捣作,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹅士。 梳的紋絲不亂的頭發(fā)上券躁,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音掉盅,去河邊找鬼也拜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趾痘,可吹牛的內(nèi)容都是我干的慢哈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼永票,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼卵贱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣集,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤键俱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后世分,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體编振,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年罚攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了党觅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌澄。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杯瞻,靈堂內(nèi)的尸體忽然破棺而出镐牺,到底是詐尸還是另有隱情,我是刑警寧澤魁莉,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布睬涧,位于F島的核電站,受9級(jí)特大地震影響旗唁,放射性物質(zhì)發(fā)生泄漏畦浓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一检疫、第九天 我趴在偏房一處隱蔽的房頂上張望讶请。 院中可真熱鬧,春花似錦屎媳、人聲如沸夺溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风响。三九已至,卻和暖如春丹禀,著一層夾襖步出監(jiān)牢的瞬間状勤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工双泪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留持搜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓攒读,卻偏偏與公主長(zhǎng)得像朵诫,于是被迫代替她去往敵國(guó)和親辛友。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄扁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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