AFNetworking3.0/NSURLSession的優(yōu)勢

很多時候状共,AFNetworking都是目前iOS開發(fā)者網(wǎng)絡(luò)庫中的不二選擇丽焊。Github上2W+的star數(shù)足見其流行程度余耽。而從iOS7.0開始戴而,蘋果推出了新的網(wǎng)絡(luò)庫繼承者NSURLSession后,AFNetworking也毫不猶豫地加入了對其的支持挽霉。3.0+更加只是提供了NSURLSession的支持防嗡。

我們使用AFNetworking的時候,可能會有很多的朋友都會采用以下的寫法:

    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    sessionManager.requestSerializer     = [AFHTTPRequestSerializer serializer];
    sessionManager.responseSerializer    = [AFHTTPResponseSerializer serializer];
    [sessionManager GET:urlString
             parameters:parameters
               progress:progressBlock
                success:successHandler
                failure:failureHandler];

大概可以描述一下這個過程侠坎,每次開啟一個網(wǎng)絡(luò)請求時蚁趁,首先新建一個AFHTTPSessionManager,然后將相關(guān)的requestSerializer和reponseSerializer賦值实胸;最后發(fā)起相應(yīng)的GET/POST等請求他嫡。

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

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

這個過程其實和上面的基本一致童芹。新建一個Session涮瞻,然后新建task,激活task假褪,完成網(wǎng)絡(luò)請求署咽。

那么現(xiàn)在問題來了。為什么每次都需要新建一個SessionManager/Session生音?如果在多個Task請求的情況下宁否,如果采取一個共享的SessionManager/Session是否可行?如果可行缀遍,與之前每次新建SessionManager/Session相比慕匠,孰優(yōu)孰劣?

本篇文章會告訴您:

  1. 為什么要使用NSURLSession而不是NSURLConnection
  2. 為什么要用共享的SessionManager/Session域醇,而不是每次都啟動一個新的

為什么要選擇NSURLSession

NSURLSession在iOS7.0時被Apple提出后台谊,雖然Apple一直對其良好的API設(shè)計大力推廣蓉媳,然而其能夠達(dá)到的效果,似乎一直都和NSURLConnection不相伯仲锅铅。

特別是在網(wǎng)絡(luò)的Dependecy依賴處理上酪呻,由于AFNetworking優(yōu)秀的架構(gòu)設(shè)計,NSURLSession甚至還不如NSURLConnection好用盐须。那么玩荠,有什么理由切換到NSURLSession? 2015年的WWDC似乎告訴了我們答案贼邓。

HTTP /2, 2015年5月RFC 7540正式發(fā)表的下一代HTTP協(xié)議阶冈,是1999年來HTTP 1.1發(fā)布后的首個更新。相對于前一個版本塑径,HTTP /2以快著稱女坑。如下圖,對相同圖片统舀、相同服務(wù)器的下載堂飞,在不同協(xié)議下所需的時間:

111.jpg

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

更人性化更優(yōu)秀的API設(shè)計衡蚂,HTTP /2的支持窿克,這是否能成為你使用NSURLSession的理由?至少它們成為了說服我的理由毛甲。

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

在回答這個問題以前,我們先來聊聊網(wǎng)絡(luò)的通訊協(xié)議玻募。我們也都知道只损,HTTP協(xié)議是基于TCP協(xié)議的。所以在每次的HTTP請求之前七咧,客戶端和服務(wù)器端跃惫,都先需要經(jīng)過TCP連接的三次握手,即每次請求之前艾栋,網(wǎng)絡(luò)的數(shù)據(jù)都已經(jīng)在客戶端和服務(wù)器端之間來回了三次爆存。如下圖:

222.jpg

TCP三次握手(圖片來源于網(wǎng)絡(luò))
事實上在HTTP 0.9, HTTP 1.0協(xié)議的時代,每次HTTP的請求蝗砾,都需要先經(jīng)過TCP的連接先较,然后才開始HTTP的請求携冤,這樣一個流程圖,我們可以通過抓包看到:
抓包
那么闲勺,為了讓我們的請求更快曾棕,避免每次都產(chǎn)生一個TCP三次握手,成了一個優(yōu)化的選項霉翔。于是在HTTP 1.1中睁蕾,出現(xiàn)了Connection: keep-alive這個選項。這個優(yōu)化選項债朵,可以使得客戶端和服務(wù)器端復(fù)用一個TCP連接子眶,從而減小每次的網(wǎng)絡(luò)請求時間。
聊到這里序芦,本章提出的問題臭杰,其實答案已經(jīng)逐漸明了了。沒錯谚中,共享的Session將會復(fù)用TCP的連接渴杆,而每次都新建Session的操作將導(dǎo)致每次的網(wǎng)絡(luò)請求都開啟一個TCP的三次握手。

從上面兩張圖宪塔,我們可以清晰地看到磁奖,同樣都是兩次HTTP請求,共享Session的代碼在第二次網(wǎng)絡(luò)請求時少了TCP的三次握手的過程某筐。即加速了整個網(wǎng)絡(luò)的請求時間比搭。

事實上,蘋果的文檔中南誊,還對一個服務(wù)器最高的TCP并發(fā)有相應(yīng)的描述:

HTTPMaximumConnectionsPerHost  Property
The maximum number of simultaneous connections to make to a given host.
 
Declaration
SWIFT
    var HTTPMaximumConnectionsPerHost: Int
OBJECTIVE-C
    @property NSInteger HTTPMaximumConnectionsPerHost
Discussion
This 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 you use multiple sessions, your app as a whole may exceed this limit. Additionally, depending on your connection to the Internet, a session may use a lower limit than the one you specify.
 
The default value is 6 in OS X, or 4 in iOS.
 
Availability
Available in iOS 7.0 and later.

我們可以看到身诺,默認(rèn)配置下,iOS對于同一個IP服務(wù)器的并發(fā)最大為4抄囚,OS X為6霉赡。而如果你沒有使用共享的Session,則可能會超過這個數(shù)幔托。

因此穴亏,如果能用共享的Session,還是用共享的吧柑司。有些許的網(wǎng)絡(luò)加速迫肖,也是一件不錯的事情,您說呢攒驰?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟆湖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玻粪,更是在濱河造成了極大的恐慌隅津,老刑警劉巖诬垂,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伦仍,居然都是意外死亡结窘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門充蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧枫,“玉大人,你說我怎么就攤上這事谓苟」倥В” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵涝焙,是天一觀的道長卑笨。 經(jīng)常有香客問我,道長仑撞,這世上最難降的妖魔是什么赤兴? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮隧哮,結(jié)果婚禮上桶良,老公的妹妹穿的比我還像新娘。我一直安慰自己沮翔,他們只是感情好艺普,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鉴竭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岸浑。 梳的紋絲不亂的頭發(fā)上搏存,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音矢洲,去河邊找鬼璧眠。 笑死,一個胖子當(dāng)著我的面吹牛读虏,可吹牛的內(nèi)容都是我干的责静。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盖桥,長吁一口氣:“原來是場噩夢啊……” “哼灾螃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揩徊,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腰鬼,失蹤者是張志新(化名)和其女友劉穎嵌赠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熄赡,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡姜挺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彼硫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊豪。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拧篮,靈堂內(nèi)的尸體忽然破棺而出词渤,到底是詐尸還是另有隱情,我是刑警寧澤他托,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布掖肋,位于F島的核電站,受9級特大地震影響赏参,放射性物質(zhì)發(fā)生泄漏志笼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一把篓、第九天 我趴在偏房一處隱蔽的房頂上張望纫溃。 院中可真熱鬧,春花似錦韧掩、人聲如沸紊浩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坊谁。三九已至,卻和暖如春滑臊,著一層夾襖步出監(jiān)牢的瞬間口芍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工雇卷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鬓椭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓关划,卻偏偏與公主長得像小染,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贮折,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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