1. 程式人生 > >iOS網路-04-大檔案下載

iOS網路-04-大檔案下載

  • 支援斷點下載,自動記錄停止下載時斷點的位置
  • 遵守NSURLSessionDownloadDelegate協議
  • 使用NSURLSession下載大檔案,被下載檔案會被自動寫入沙盒的臨時資料夾tmp中
  • 下載完畢,通常需要將已下載檔案移動其他位置(tmp資料夾中的資料被定時刪除),通常是cache資料夾中
  • 詳細的下載步驟
    • 設定下載任務task的為成員變數

      @property (nonatomic, strong) NSURLSessionDownloadTask *task;
    • 獲取NSURLSession物件

      NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]]
      ;
    • 初始化下載任務任務

      self.task = [session downloadTaskWithURL:(此處為下載檔案路徑URL)];
    • 實現代理方法

      /**每當寫入資料到臨時檔案的時候,就會呼叫一次該方法,通常在該方法中獲取下載進度*/
      - (void)URLSession:(NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
      {
          // 計算下載進度
      CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite; } /**任務終止時呼叫的方法,通常用於斷點下載*/ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { //fileOffset:下載任務中止時的偏移量
      } /**遇到錯誤的時候呼叫,error引數只能傳遞客戶端的錯誤*/ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { } /**下載完成的時候呼叫,需要將檔案剪下到可以長期儲存的資料夾中*/ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { //生成檔案長期儲存的路徑 NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename]; //獲取檔案控制代碼 NSFileManager *fileManager = [NSFileManager defaultManager]; //通過檔案控制代碼,將檔案剪下到檔案長期儲存的路徑 [fileManager moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil]; }
    • 操作任務狀態

      /**開始/繼續下載任務*/
      [self.task resume];
      
      /**暫停下載任務*/
      [self.task suspend];