NSURLSessionDownloadTask實現大文件下載


4 NSURLSessionDownloadTask實現大文件下載

(1)使用NSURLSession和NSURLSessionDownload可以很方便的實現文件下載操作

 /* 第一個參數:要下載文件的url路徑 第二個參數:當接收完服務器返回的數據之后調用該block location:下載的文件的保存地址(默認是存儲在沙盒中tmp文件夾下面,隨時會被刪除) response:服務器響應信息,響應頭 error:該請求的錯誤信息 */
    //說明:downloadTaskWithURL方法已經實現了在下載文件數據的過程中邊下載文件數據,邊寫入到沙盒文件的操作
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * __nullable location, NSURLResponse * __nullable response, NSError * __nullable error)

(2)downloadTaskWithURL內部默認已經實現了變下載邊寫入操作,所以不用開發人員擔心內存問題

(3)文件下載后默認保存在tmp文件目錄,需要開發人員手動的剪切到合適的沙盒目錄

(4)缺點:沒有辦法監控下載進度


5 使用NSURLSessionDownloadTask實現大文件下載-監聽下載進度

(1)創建NSURLSession並設置代理,通過NSURLSessionDownloadTask並以代理的方式來完成大文件的下載

     //1.創建NSULRSession,設置代理
    self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    //2.創建task
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
    self.downloadTask = [self.session downloadTaskWithURL:url];

    //3.執行task
    [self.downloadTask resume];

(2)常用代理方法的說明

    /* 1.當接收到下載數據的時候調用,可以在該方法中監聽文件下載的進度 該方法會被調用多次 totalBytesWritten:已經寫入到文件中的數據大小 totalBytesExpectedToWrite:目前文件的總大小 bytesWritten:本次下載的文件數據大小 */
-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
/* 2.恢復下載的時候調用該方法 fileOffset:恢復之后,要從文件的什么地方開發下載 expectedTotalBytes:該文件數據的總大小 */
-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
/* 3.下載完成之后調用該方法 */
-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(nonnull NSURL *)location
/* 4.請求完成之后調用 如果請求失敗,那么error有值 */
-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error

(3)實現斷點下載相關代碼

    //如果任務,取消了那么以后就不能恢復了
    // [self.downloadTask cancel];

    //如果采取這種方式來取消任務,那么該方法會通過resumeData保存當前文件的下載信息
    //只要有了這份信息,以后就可以通過這些信息來恢復下載
    [self.downloadTask cancelByProducingResumeData:^(NSData * __nullable resumeData) {
        self.resumeData = resumeData;
    }];

    -----------
    //繼續下載
    //首先通過之前保存的resumeData信息,創建一個下載任務
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];

     [self.downloadTask resume];

(4)計算當前下載進度

objc
//獲取文件下載進度
self.progress.progress=1.0*totalBytesWritten/totalBytesExpectedToWrite;

(5)局限性

01 如果用戶點擊暫停之后退出程序,那么需要把恢復下載的數據寫一份到沙盒,代碼復雜度更
02 如果用戶在下載中途未保存恢復下載數據即退出程序,則不具備可操作性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM