iOS開發之網路編程--3、NSURLSessionDataTask實現檔案下載(離線斷點續傳下載),nsurlsession斷點續傳
前言:使用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、源碼展示: