共享AFHTTPSessionManager 單例好處淺析

很多時(shí)候奕纫,AFNetworking都是目前iOS開發(fā)者網(wǎng)絡(luò)庫中的不二選擇裸扶。Github上2W+的star數(shù)足見其流行程度咱旱。而從iOS7.0開始,蘋果推出了新的網(wǎng)絡(luò)庫繼承者NSURLSession后茫多,AFNetworking也毫不猶豫地加入了對(duì)其的支持祈匙。3.0+更加只是提供了NSURLSession的支持。

我們使用AFNetworking的時(shí)候天揖,可能會(huì)有很多的朋友都會(huì)采用以下的寫法:

AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];? ? sessionManager.requestSerializer? ? = [AFHTTPRequestSerializer serializer];? ? sessionManager.responseSerializer? ? = [AFHTTPResponseSerializer serializer];? ? [sessionManagerGET:urlStringparameters:parametersprogress:progressBlocksuccess:successHandlerfailure:failureHandler];

大概可以描述一下這個(gè)過程菊卷,每次開啟一個(gè)網(wǎng)絡(luò)請(qǐng)求時(shí),首先新建一個(gè)AFHTTPSessionManager宝剖,然后將相關(guān)的requestSerializer和reponseSerializer賦值洁闰;最后發(fā)起相應(yīng)的GET/POST等請(qǐng)求。

而如果是直接采用NSURLSession來請(qǐng)求網(wǎng)絡(luò)呢万细,我們則經(jīng)常會(huì)采用以下的寫法:

NSURLSession *session =? [NSURLSession? ? sessionWithConfiguration:? ? [NSURLSessionConfiguration defaultSessionConfiguration]? ? delegate:nil? ? ? delegateQueue:[NSOperationQueue mainQueue]];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request

? ? ? completionHandler:completionHandler];

? ? [dataTask resume];

這個(gè)過程其實(shí)和上面的基本一致扑眉。新建一個(gè)Session,然后新建task赖钞,激活task腰素,完成網(wǎng)絡(luò)請(qǐng)求。

那么現(xiàn)在問題來了雪营。為什么每次都需要新建一個(gè)SessionManager/Session弓千?如果在多個(gè)Task請(qǐng)求的情況下,如果采取一個(gè)共享的SessionManager/Session是否可行献起?如果可行洋访,與之前每次新建SessionManager/Session相比,孰優(yōu)孰劣谴餐?

本篇文章會(huì)告訴您

1. 為什么要使用NSURLSession而不是NSURLConnection

2. 為什么要用共享的SessionManager/Session姻政,而不是每次都啟動(dòng)一個(gè)新的

為什么要選擇NSURLSession

NSURLSession在iOS7.0時(shí)被Apple提出后,雖然Apple一直對(duì)其良好的API設(shè)計(jì)大力推廣岂嗓,然而其能夠達(dá)到的效果汁展,似乎一直都和NSURLConnection不相伯仲。

特別是在網(wǎng)絡(luò)的Dependecy依賴處理上,由于AFNetworking優(yōu)秀的架構(gòu)設(shè)計(jì)食绿,NSURLSession甚至還不如NSURLConnection好用侈咕。那么,有什么理由切換到NSURLSession器紧? 2015年的WWDC似乎告訴了我們答案耀销。

HTTP /2, 2015年5月RFC 7540正式發(fā)表的下一代HTTP協(xié)議,是1999年來HTTP 1.1發(fā)布后的首個(gè)更新品洛。相對(duì)于前一個(gè)版本树姨,HTTP /2以快著稱摩桶。如下圖桥状,對(duì)相同圖片、相同服務(wù)器的下載硝清,在不同協(xié)議下所需的時(shí)間:

http2

這里我們并不打算展開HTTP /2的原理辅斟,有興趣的同學(xué)可以Google之。根據(jù)2015的WWDC Session711芦拿,我們知道iOS9+士飒,NSURLSession開始正式支持HTTP /2,也就意味著你的網(wǎng)絡(luò)連接速度也可以有如上圖那樣的提升蔗崎。

更人性化更優(yōu)秀的API設(shè)計(jì)酵幕,HTTP /2的支持,這是否能成為你使用NSURLSession的理由缓苛?至少它們成為了說服我的理由芳撒。

為什么要盡量共享Session,而不是每次新建Session

在回答這個(gè)問題以前未桥,我們先來聊聊網(wǎng)絡(luò)的通訊協(xié)議笔刹。我們也都知道,HTTP協(xié)議是基于TCP協(xié)議的冬耿。所以在每次的HTTP請(qǐng)求之前舌菜,客戶端和服務(wù)器端,都先需要經(jīng)過TCP連接的三次握手亦镶,即每次請(qǐng)求之前日月,網(wǎng)絡(luò)的數(shù)據(jù)都已經(jīng)在客戶端和服務(wù)器端之間來回了三次。如下圖:

TCP三次握手(圖片來源于網(wǎng)絡(luò))

事實(shí)上在HTTP 0.9,?HTTP 1.0協(xié)議的時(shí)代缤骨,每次HTTP的請(qǐng)求山孔,都需要先經(jīng)過TCP的連接,然后才開始HTTP的請(qǐng)求荷憋,這樣一個(gè)流程圖台颠,我們可以通過抓包看到:

抓包

那么,為了讓我們的請(qǐng)求更快,避免每次都產(chǎn)生一個(gè)TCP三次握手串前,成了一個(gè)優(yōu)化的選項(xiàng)瘫里。于是在HTTP 1.1中,出現(xiàn)了Connection: keep-alive這個(gè)選項(xiàng)荡碾。這個(gè)優(yōu)化選項(xiàng)谨读,可以使得客戶端和服務(wù)器端復(fù)用一個(gè)TCP連接,從而減小每次的網(wǎng)絡(luò)請(qǐng)求時(shí)間坛吁。

非共享Session

共享Session

聊到這里劳殖,本章提出的問題,其實(shí)答案已經(jīng)逐漸明了了拨脉。沒錯(cuò)哆姻,共享的Session將會(huì)復(fù)用TCP的連接,而每次都新建Session的操作將導(dǎo)致每次的網(wǎng)絡(luò)請(qǐng)求都開啟一個(gè)TCP的三次握手玫膀。

從上面兩張圖矛缨,我們可以清晰地看到,同樣都是兩次HTTP請(qǐng)求帖旨,共享Session的代碼在第二次網(wǎng)絡(luò)請(qǐng)求時(shí)少了TCP的三次握手的過程箕昭。即加速了整個(gè)網(wǎng)絡(luò)的請(qǐng)求時(shí)間。

事實(shí)上解阅,蘋果的文檔中落竹,還對(duì)一個(gè)服務(wù)器最高的TCP并發(fā)有相應(yīng)的描述:

HTTPMaximumConnectionsPerHost? PropertyThe maximum number of simultaneous connections to make to a given host.DeclarationSWIFT? ? var HTTPMaximumConnectionsPerHost: IntOBJECTIVE-C? ? @property NSInteger HTTPMaximumConnectionsPerHostDiscussionThis property determines the maximum number of simultaneous connections made to each host by tasks within sessions based on this configuration.This limit is per session, so if youuse multiple sessions, your appas a whole may exceed thislimit. Additionally, dependingon yourconnectionto the Internet, asession mayuse alowerlimitthan the one you specify.Thedefaultvalueis6in OS X,or4in iOS.AvailabilityAvailablein iOS7.0and later.

我們可以看到,默認(rèn)配置下货抄,iOS對(duì)于同一個(gè)IP服務(wù)器的并發(fā)最大為4述召,OS X為6。而如果你沒有使用共享的Session碉熄,則可能會(huì)超過這個(gè)數(shù)桨武。

因此,如果能用共享的Session锈津,還是用共享的吧呀酸。有些許的網(wǎng)絡(luò)加速,也是一件不錯(cuò)的事情琼梆,您說呢性誉?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茎杂,隨后出現(xiàn)的幾起案子错览,更是在濱河造成了極大的恐慌,老刑警劉巖煌往,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妙真,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垂涯,警方通過查閱死者的電腦和手機(jī)厘灼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摄职,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事∷逗” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵腊徙,是天一觀的道長简十。 經(jīng)常有香客問我,道長撬腾,這世上最難降的妖魔是什么螟蝙? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮时鸵,結(jié)果婚禮上胶逢,老公的妹妹穿的比我還像新娘厅瞎。我一直安慰自己饰潜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布和簸。 她就那樣靜靜地躺著彭雾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锁保。 梳的紋絲不亂的頭發(fā)上薯酝,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音爽柒,去河邊找鬼吴菠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浩村,可吹牛的內(nèi)容都是我干的做葵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼心墅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酿矢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怎燥,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤瘫筐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铐姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策肝,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了之众。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篇梭。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酝枢,靈堂內(nèi)的尸體忽然破棺而出恬偷,到底是詐尸還是另有隱情,我是刑警寧澤帘睦,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布袍患,位于F島的核電站,受9級(jí)特大地震影響竣付,放射性物質(zhì)發(fā)生泄漏诡延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一古胆、第九天 我趴在偏房一處隱蔽的房頂上張望肆良。 院中可真熱鬧,春花似錦逸绎、人聲如沸惹恃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巫糙。三九已至,卻和暖如春颊乘,著一層夾襖步出監(jiān)牢的瞬間参淹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工乏悄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙值,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓檩小,卻偏偏與公主長得像开呐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子识啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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