[toc]
1 Connect與Session
先看看官方文檔對于URLSession的第一句描述。
NSURLSession is a replacement API for NSURLConnection。
也就是說Apple推出URLSession就是用來替換NSURLConnection。那么為什么要搞出來個URLSession去代替NSURLConnection而不是在NSURLConnection上去迭代?
我們先理解一下session和connect的直觀含義,前者是會話、后者是連接,做過數(shù)據(jù)庫、通信協(xié)議相關(guān)開發(fā)和研究工作的小伙伴都能理解這二者的區(qū)別。
我們先看看數(shù)據(jù)庫訪問中二者的區(qū)別(以下摘自 Oracle 9i &10g 編程藝術(shù)):
連接(connection):連接是從客戶到Oracle 實例的一條物理路徑。連接可以在網(wǎng)絡(luò)上建立,或者通過IPC機(jī)制建立。通常會在客戶進(jìn)程與一個專用服務(wù)器或一個調(diào)度器之間建立連接。
會話(session):會話是實例中存在的一個邏輯實體。這就是你的會話狀態(tài)(session state),也就是表示特定會話的一組內(nèi)存中的數(shù)據(jù)結(jié)構(gòu).提到"數(shù)據(jù)庫連接"時,大多數(shù)人首先想到的就是“會話”。你要在服務(wù)器中的會話上執(zhí)行SQL、提交事務(wù)和運行存儲過程。
一般來說,會話=連接+狀態(tài),一個連接可以提供給多個會話,而一個會話也有可能利用多個連接。
有小伙伴會說,http是無狀態(tài)的,所以只有http連接一說,沒有http會話一說。確實,早期http是無狀態(tài)的,后來為了提高h(yuǎn)ttp工作的效率,加入了cookie/session機(jī)制,cookie/session保存http的狀態(tài),http會話由此誕生。
據(jù)此,Apple將他們設(shè)備里的一個http請求當(dāng)做一個http會話,或者說是一個URLSession是沒有任務(wù)問題的。
2 從URLConnection到URLSession的轉(zhuǎn)變與http2.0是不是有聯(lián)系
從URLConnection到URLSession的轉(zhuǎn)變與http2.0是不是有聯(lián)系呢?我們先看看兩個時間點:
ios7.0發(fā)布時間 2013.09
http2.0草案測試版本發(fā)布時間 2013.08
協(xié)議的目標(biāo):
異步多路復(fù)用
頭部壓縮
請求/響應(yīng)管線化
重點看看這個異步多路復(fù)用,不了解的小伙伴可以去這篇博客了解一下,淺析HTTP/2的多路復(fù)用。
我這里簡單的說一下,http1.1搞出來個長連接,主要是為了解決http1.0發(fā)起一個http請求要重新通過tcp握手協(xié)議建立tcp通道的資源浪費問題。但是http1.1又有個問題:串行的文件傳輸效率低、服務(wù)器連接數(shù)過多壓力過大問題。于是在http2.0就搞出了個多路復(fù)用。
總結(jié)
回到我們的問題:從URLConnection到URLSession的轉(zhuǎn)變與http2.0是不是有聯(lián)系呢?
以前我們對于一個http請求,就說是一個connection顯然是合適了。但是在http2.0,APP應(yīng)用或者瀏覽器和同一個域名所有http交互都用的是同一個http連接,也就是說肯定不會創(chuàng)建連接。
用什么合適呢?Apple大大說用Session合適。