前言:使用NSURLSessionDownloadTask滿足不這個需要離線斷點續傳的下載需求,所以這里就需要使用NSURLSessionDataTask的代理方法來處理下載大文件,並且實現離線斷點續傳。
關於NSURLSessionDownloadTask的知識,可以請讀者閱讀本人的前篇:《iOS開發之網絡編程--2、NSURLSessionDownloadTask文件下載》。
另外呢,因為NSURLSessionDownloadTask和NSURLSessionDataTask分別都是NSURLSessionTask的上層繼承拓展。比如NSURLSessionDownloadTask在代理方法中內部實現了
將文件邊下載邊移存到沙盒中,而使用NSURLSessionDataTask就需要自己完成這個過程了,但是NSURLSessionDataTask可以實現離線斷點續傳。
實現離線的斷點續傳的基本思路:
1、比如應用程序下載15M的小視視頻,但是下載到5M的時候這個程序可能是因為用戶需要其退出或者是意外崩潰退出或者是斷網了,導致還有10M沒有下載成功。
2、為了能夠在重新啟動程序之后還能夠繼續下載剩下的10M,需要在程序繼續下載的時候判斷和讀取本地緩存中是否存在已經下載的數據和數據長度,然后在該數據長度之后繼續下載剩下的部分。
用於測試代碼的API接口:http://120.25.226.186:32812/resources/videos/minion_02.mp4
1、NSURLSessionDataTask實現文件下載(未實現離線斷點續傳下載)
1-1、編程思路實現細節:
<a> 創建會話和請求,最后由會話創建請求任務,並啟動任務。
<b>添加協議<NSURLSessionDataDelegate> ,設置代理,實現代理方法。
<c>在獲取服務器返回的響應代理方法中獲取文件名和要下載的文件長度,拼接沙盒路徑,根據該路徑創建輸出流,開啟輸出流。別忘了還需要設置接收服務器響應。
<d>在獲取服務器返回的數據代理方法中,不斷的使用輸出流將數據寫入,並通過獲取的數據設置進度條進度。
<e>在結束服務器請求的代理方法中,關閉輸出流,釋放輸出流的指針。另外可能會需要打印錯誤信息。
1-2、代碼實現:
2、NSURLSessionDataTask實現文件下載(實現離線斷點續傳下載)
2-1、編程思路實現細節:
<a> 根據文件名拼接沙盒路徑,直接獲取該文件的屬性,如果沒有該文件,則返回的是nil,如果有該文件,則讀取文件其中的一個屬性:文件數據的長度。
<b>創建會話和可變請求,設置請求頭信息,告訴服務器返回的數據從已經下載的文件長度后面開始下載,最后由會話創建請求任務,並啟動任務。
<c>添加協議<NSURLSessionDataDelegate> ,設置代理,實現代理方法。
<d>在獲取服務器返回的響應代理方法中獲取文件名和要下載的文件長度,拼接沙盒路徑,根據該路徑創建輸出流,開啟輸出流。別忘了還需要設置接收服務器響應。
<e>在獲取服務器返回的數據代理方法中,不斷的使用輸出流將數據寫入,並通過獲取的數據設置進度條進度。
<f>在結束服務器請求的代理方法中,關閉輸出流,釋放輸出流的指針。另外可能會需要打印錯誤信息。
<g>最后別忘了釋放會話對象(兩種方法均可)
2-2、源碼展示: