詳細(xì)解析幾個(gè)和網(wǎng)絡(luò)請(qǐng)求有關(guān)的類(四) —— NSURLSession和NSURLConnection的區(qū)別

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.03.05

前言

我們做APP發(fā)起網(wǎng)絡(luò)請(qǐng)求,一般都是使用框架,這些框架的底層也都是蘋果的API,接下來(lái)幾篇就一起來(lái)看一下和網(wǎng)絡(luò)有關(guān)的幾個(gè)類。感興趣的可以看上面幾篇文章。
1. 詳細(xì)解析幾個(gè)和網(wǎng)絡(luò)請(qǐng)求有關(guān)的類 (一) —— NSURLSession
2. 詳細(xì)解析幾個(gè)和網(wǎng)絡(luò)請(qǐng)求有關(guān)的類(二) —— NSURLRequest和NSMutableURLRequest
3. 詳細(xì)解析幾個(gè)和網(wǎng)絡(luò)請(qǐng)求有關(guān)的類(三) —— NSURLConnection

二者的生死關(guān)系

蘋果以前的API是2.0 推出的NSURLConnection,但是從iOS 7.0開始NSURLSession開始使用,同時(shí)NSURLConnection被棄用,比較典型的就是AFN這個(gè)框架的變化,也跟著完成了這個(gè)過渡。

NSURLSession相對(duì)于NSURLConnection來(lái)說(shuō),有很多優(yōu)勢(shì)。

  • 后臺(tái)上傳和下載。
  • 可以暫停和重啟網(wǎng)絡(luò)操作。
  • 可以對(duì)緩存策略,session類型、任務(wù)類型(比如上傳、下載等任務(wù))進(jìn)行單獨(dú)的配置。
  • 更多更豐富的代理模式。

NSURLSession 支持HTTP 2.0


普通任務(wù)、上傳和下載任務(wù)

NSURLSession針對(duì)普通、上傳和下載任務(wù)專門提供了特殊的類NSURLSessionDataTask、NSURLSessionUploadTaskNSURLSessionDownloadTask進(jìn)行處理。與NSURLConnection相比更加的專業(yè)化。

1. 普通任務(wù)

當(dāng)服務(wù)器返回的數(shù)據(jù)量較小的時(shí)候,NSURLSessionNSURLConnection執(zhí)行普通任務(wù)的操作步驟沒有區(qū)別。

2. 上傳任務(wù)

都需要設(shè)置POST請(qǐng)求的請(qǐng)求體進(jìn)行上傳。

3. 下載任務(wù)

這個(gè)也是這兩個(gè)類的最大區(qū)別。

  • NSURLConnection下載文件時(shí),使用異步回調(diào)先是將整個(gè)文件下載到內(nèi)存,然后再寫入到沙盒,如果文件比較大,就會(huì)出現(xiàn)內(nèi)存暴漲的情況。并且,使用異步回調(diào)無(wú)法監(jiān)聽下載進(jìn)度。

  • NSURLSession使用NSURLSessionUploadTask下載文件,會(huì)默認(rèn)下載到沙盒中的tem文件中,不會(huì)出現(xiàn)內(nèi)存暴漲的情況,但是在下載完成后會(huì)把tem中的臨時(shí)文件刪除,需要在初始化任務(wù)方法時(shí),在completionHandler回調(diào)中增加保存文件的代碼。

斷點(diǎn)續(xù)傳

  • NSURLConnection進(jìn)行斷點(diǎn)下載,通過設(shè)置訪問請(qǐng)求的HTTPHeaderFieldRange屬性,開啟運(yùn)行循環(huán),NSURLConnection的代理方法作為運(yùn)行循環(huán)的事件源,接收到下載數(shù)據(jù)時(shí)代理方法就會(huì)持續(xù)調(diào)用,并使用NSOutputStream管道流進(jìn)行數(shù)據(jù)保存。

  • NSURLSession進(jìn)行斷點(diǎn)下載,當(dāng)暫停下載任務(wù)后,如果downloadTask(下載任務(wù))為非空,調(diào)用cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler這個(gè)方法,這個(gè)方法接收一個(gè)參數(shù),完成處理代碼塊,這個(gè)代碼塊有一個(gè)NSData參數(shù)resumeData,如果resumeData非空,我們就保存這個(gè)對(duì)象到視圖控制器的resumeData屬性中,在點(diǎn)擊再次下載時(shí),通過調(diào)用[ [self.session downloadTaskWithResumeData:self.resumeData] resume]方法進(jìn)行繼續(xù)下載操作。


請(qǐng)求方法的控制

  • NSURLConnection實(shí)例化對(duì)象,實(shí)例化開始,默認(rèn)請(qǐng)求就發(fā)送(同步發(fā)送),不需要調(diào)用start方法。而cancel可以停止請(qǐng)求的發(fā)送,停止后不能繼續(xù)訪問,需要?jiǎng)?chuàng)建新的請(qǐng)求。
  • NSURLSession有三個(gè)控制方法,取消(cancel)、暫停(suspend)、繼續(xù)(resume),暫停以后可以通過繼續(xù)恢復(fù)當(dāng)前的請(qǐng)求任務(wù)。

Session的配置信息

  • NSURLSession的構(gòu)造方法(sessionWithConfiguration:delegate:delegateQueue)中有一個(gè)NSURLSessionConfiguration類的參數(shù)可以設(shè)置配置信息,其決定了cookie,安全和高速緩存策略,最大主機(jī)連接數(shù),資源管理,網(wǎng)絡(luò)超時(shí)等配置。

  • NSURLConnection不能進(jìn)行這個(gè)配置,依賴與一個(gè)全局的配置對(duì)象,缺乏靈活性。

參考文章

1. NSURLSession與NSURLConnection區(qū)別
2. NSURLSession和NSURLConnection比較
3. NSURLSession 和 NSURLConnection的區(qū)別

后記

本篇的主要內(nèi)容是NSURLSessionNSURLConnection的區(qū)別,更多的是借鑒別人的總結(jié)文章加上自己的理解,參考的文章已經(jīng)在后面列出來(lái)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容