很多時(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ò)的事情琼梆,您說呢性誉?