iOS如何實(shí)現(xiàn)文件下載

這篇文章給大家分享的是有關(guān)iOS如何實(shí)現(xiàn)文件下載的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)西城,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

  • 原生態(tài)的分段下載的基本原理

文件下載往往需要比較長的一段時(shí)間,實(shí)現(xiàn)分段下載是實(shí)現(xiàn)斷點(diǎn)下載的前提

實(shí)現(xiàn)分段下載需要解決以下兩個(gè)問題

    問題1:下載前,需要知道文件的長度

    問題2:每一次請求下載文件的一段

  • 針對(duì)問題1:HEAD請求獲取文件長度

HEAD請求只獲取響報(bào)文,而不獲取資源的實(shí)際數(shù)據(jù)

     通常用來獲取文件長度、檢測服務(wù)器端資源是否發(fā)生變化

響應(yīng)對(duì)象NSURLResponse的屬性exceptedContentLength即表示文件的長度

     iOS如何實(shí)現(xiàn)文件下載

  • 針對(duì)問題2:請求頭參數(shù)Range進(jìn)行分段下載

HTTP協(xié)議規(guī)定,請求頭中的Range參數(shù)用于請求一段數(shù)據(jù)

如:

     bytes=0-499                     從0到499的頭500個(gè)字節(jié)      

     bytes=500-999                 從500到999的第二個(gè)500字節(jié)

     bytes=500-                       從500字節(jié)以后的所有字節(jié)   

     bytes=-500                       最后500個(gè)字節(jié)

     bytes=500-599,800-899   同時(shí)指定幾個(gè)范圍

也就是說,分段下載,就是發(fā)送多次多次請求,每次請求設(shè)置Range字段

下面的代碼,完成一個(gè)文件的分段下載:

     iOS如何實(shí)現(xiàn)文件下載

下面的代碼,完成文件的一段下載:

     iOS如何實(shí)現(xiàn)文件下載

使用異步下載時(shí),應(yīng)使用代理、通知、block進(jìn)行下載后的處理動(dòng)作。

  • NSURLSession的下載任務(wù)

下載任務(wù)的創(chuàng)建:

- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL*location, NSURLResponse *response, NSError*error))completionHandler

NSURLSession執(zhí)行下載任務(wù)相關(guān)的代理方法:

// 周期性的調(diào)用,參數(shù)描述了下載的進(jìn)度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
// 下載完成時(shí)調(diào)用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL *)location

示例說明:

1)創(chuàng)建NSURLSession對(duì)象并指定代理

    iOS如何實(shí)現(xiàn)文件下載

2)創(chuàng)建下載任務(wù)并啟動(dòng)

    iOS如何實(shí)現(xiàn)文件下載

3)實(shí)現(xiàn)下載完成的代理方法:應(yīng)將下載完成后的文件移動(dòng)到指定目錄并重命名

    iOS如何實(shí)現(xiàn)文件下載

4)實(shí)現(xiàn)下載進(jìn)度監(jiān)聽的代理方法:

    iOS如何實(shí)現(xiàn)文件下載

  • 下載暫停/繼續(xù)的實(shí)現(xiàn)

NSURLSessionDownloadTask的暫停方法:

- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler

     參數(shù)resumeData:描述斷點(diǎn)信息

NSURLSession通過斷點(diǎn)信息創(chuàng)建下載任務(wù):

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError*error))completionHandler

相關(guān)代理方法:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes

實(shí)例說明:

1)下載暫停

    iOS如何實(shí)現(xiàn)文件下載

2)下載繼續(xù)

    iOS如何實(shí)現(xiàn)文件下載

3)斷點(diǎn)繼續(xù)下載的代理方法

    iOS如何實(shí)現(xiàn)文件下載

  • 使用AFNetworking下載

使用AFNetworking進(jìn)行下載,本質(zhì)上還是創(chuàng)建NSURLSessionDownloadTask對(duì)象

     只是將代理方法的封裝到AFURLSession對(duì)象中,并用block指定行為

AFURLSessionManager創(chuàng)建下載任務(wù)

// 根據(jù)請求對(duì)象創(chuàng)建下載任務(wù)
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler
// 根據(jù)斷點(diǎn)信息創(chuàng)建愛下載任務(wù)
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler

     參數(shù)destination:該block用于指定獲取文件下載后的路徑

     參數(shù)completionHandler:該block在下載任務(wù)完成時(shí)執(zhí)行

               包括任務(wù)被暫停時(shí)(cancelByProducingResumeData)

     出參progress:非NULL時(shí),會(huì)返回一個(gè)NSProgress對(duì)象,描述下載進(jìn)度

示例說明:

1)創(chuàng)建NSURLSession對(duì)象并指定代理

    iOS如何實(shí)現(xiàn)文件下載

2)下載完成的block封裝1:應(yīng)返回下載完成的文件的最終存儲(chǔ)URL

    iOS如何實(shí)現(xiàn)文件下載

3)任務(wù)完成block封裝:包括錯(cuò)誤情況下的處理、成功請求下的提示等

    iOS如何實(shí)現(xiàn)文件下載

4)下載任務(wù)的創(chuàng)建啟動(dòng)/繼續(xù)

    iOS如何實(shí)現(xiàn)文件下載

5)下載任務(wù)的暫停

    iOS如何實(shí)現(xiàn)文件下載

  • 使用NSProgress監(jiān)聽下載進(jìn)度

在上面的代碼中,有一個(gè)參數(shù)NSProgress類型,傳的是NULL,這個(gè)參數(shù)是AFN框架用于監(jiān)聽下載進(jìn)度

NSProgress在iOS7.0引入,使用觀察者模式

     其fractionCompleted屬性值變化時(shí),通知其所有的觀察者

示例說明:

1)下載任務(wù)的創(chuàng)建啟動(dòng)/繼續(xù)

    iOS如何實(shí)現(xiàn)文件下載

2)KVO的響應(yīng)方法

    iOS如何實(shí)現(xiàn)文件下載

    其中self.progressView是一個(gè)自定義的用于顯示下載進(jìn)度的視圖對(duì)象

  • 下載任務(wù)常遇狀況

狀況一:程序退出時(shí),如何保存下載狀態(tài)

     下載任務(wù)管理類,注冊成為以下UIApplication對(duì)象通知的響應(yīng)者

          UIApplicationDidEnterBackgroundNotification

          UIApplicationWillTerminateNotification

     響應(yīng)方法實(shí)現(xiàn):將所有的下載任務(wù)暫停,并將斷點(diǎn)信息保存到本地的操作

     響應(yīng)下面通知,從本地讀出斷點(diǎn)信息的操作

          UIApplicationWillEnterForegroundNotification          

     或在下載任務(wù)管理對(duì)象被創(chuàng)建時(shí),從本地讀出斷點(diǎn)信息的操作         

狀況二:從斷點(diǎn)繼續(xù)下載時(shí),如果服務(wù)器上的文件發(fā)生變化或被刪除,應(yīng)如何處理?

     可以在從斷點(diǎn)繼續(xù)下載前,先發(fā)送一次HEAD請求,判斷文件是否存在,以及該文件的長度是否發(fā)生變化等操作。

感謝各位的閱讀!關(guān)于“iOS如何實(shí)現(xiàn)文件下載”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

本文名稱:iOS如何實(shí)現(xiàn)文件下載
文章地址:http://muchs.cn/article30/ghejso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航網(wǎng)站收錄、全網(wǎng)營銷推廣標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)