真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如:

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

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

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

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

     bytes=500-599,800-899   同時指定幾個范圍

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

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

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

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

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

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

  • 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
// 下載完成時調(diào)用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL *)location

示例說明:

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

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

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

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

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

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

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

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

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

NSURLSessionDownloadTask的暫停方法:

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

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

NSURLSession通過斷點信息創(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

實例說明:

1)下載暫停

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

2)下載繼續(xù)

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

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

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

  • 使用AFNetworking下載

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

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

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

// 根據(jù)請求對象創(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ù)斷點信息創(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ù)完成時執(zhí)行

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

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

示例說明:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

示例說明:

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

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

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

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

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

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

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

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

          UIApplicationDidEnterBackgroundNotification

          UIApplicationWillTerminateNotification

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

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

          UIApplicationWillEnterForegroundNotification          

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

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

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

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


分享標(biāo)題:iOS如何實現(xiàn)文件下載
URL鏈接:http://weahome.cn/article/ghejso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部