版本記錄
| 版本號(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、NSURLSessionUploadTask和NSURLSessionDownloadTask進(jìn)行處理。與NSURLConnection相比更加的專業(yè)化。
1. 普通任務(wù)
當(dāng)服務(wù)器返回的數(shù)據(jù)量較小的時(shí)候,NSURLSession與NSURLConnection執(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)求的HTTPHeaderField的Range屬性,開啟運(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)容是
NSURLSession和NSURLConnection的區(qū)別,更多的是借鑒別人的總結(jié)文章加上自己的理解,參考的文章已經(jīng)在后面列出來(lái)了。
