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

 5.1 涉及知識點

(1)創建NSURLSession並設置代理,通過NSURLSessionDownloadTask並以代理的方式來完成大文件的下載
 
 
    //1.創建NSURLSession,設置代理
    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)計算當前下載進度
 
//獲取文件下載進度
    self.progress.progress = 1.0 * totalBytesWritten/totalBytesExpectedToWrite;

(5)侷限性

    01 如果用戶點擊暫停之後退出程序,那麼需要把恢復下載的數據寫一份到沙盒,代碼複雜度更
    02 如果用戶在下載中途未保存恢復下載數據即退出程序,則不具備可操作性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章