這篇文章給大家分享的是有關iOS如何實現文件下載的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
原生態的分段下載的基本原理
文件下載往往需要比較長的一段時間,實現分段下載是實現斷點下載的前提
實現分段下載需要解決以下兩個問題
問題1:下載前,需要知道文件的長度
問題2:每一次請求下載文件的一段
針對問題1:HEAD請求獲取文件長度
HEAD請求只獲取響報文,而不獲取資源的實際數據
通常用來獲取文件長度、檢測服務器端資源是否發生變化
響應對象NSURLResponse的屬性exceptedContentLength即表示文件的長度
針對問題2:請求頭參數Range進行分段下載
HTTP協議規定,請求頭中的Range參數用于請求一段數據
如:
bytes=0-499 從0到499的頭500個字節
bytes=500-999 從500到999的第二個500字節
bytes=500- 從500字節以后的所有字節
bytes=-500 最后500個字節
bytes=500-599,800-899 同時指定幾個范圍
也就是說,分段下載,就是發送多次多次請求,每次請求設置Range字段
下面的代碼,完成一個文件的分段下載:
下面的代碼,完成文件的一段下載:
使用異步下載時,應使用代理、通知、block進行下載后的處理動作。
NSURLSession的下載任務
下載任務的創建:
- (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執行下載任務相關的代理方法:
// 周期性的調用,參數描述了下載的進度 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite // 下載完成時調用 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL *)location
示例說明:
1)創建NSURLSession對象并指定代理
2)創建下載任務并啟動
3)實現下載完成的代理方法:應將下載完成后的文件移動到指定目錄并重命名
4)實現下載進度監聽的代理方法:
下載暫停/繼續的實現
NSURLSessionDownloadTask的暫停方法:
- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler
參數resumeData:描述斷點信息
NSURLSession通過斷點信息創建下載任務:
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError*error))completionHandler
相關代理方法:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
實例說明:
1)下載暫停
2)下載繼續
3)斷點繼續下載的代理方法
使用AFNetworking下載
使用AFNetworking進行下載,本質上還是創建NSURLSessionDownloadTask對象
只是將代理方法的封裝到AFURLSession對象中,并用block指定行為
AFURLSessionManager創建下載任務
// 根據請求對象創建下載任務 - (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
// 根據斷點信息創建愛下載任務 - (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
參數destination:該block用于指定獲取文件下載后的路徑
參數completionHandler:該block在下載任務完成時執行
包括任務被暫停時(cancelByProducingResumeData)
出參progress:非NULL時,會返回一個NSProgress對象,描述下載進度
示例說明:
1)創建NSURLSession對象并指定代理
2)下載完成的block封裝1:應返回下載完成的文件的最終存儲URL
3)任務完成block封裝:包括錯誤情況下的處理、成功請求下的提示等
4)下載任務的創建啟動/繼續
5)下載任務的暫停
使用NSProgress監聽下載進度
在上面的代碼中,有一個參數NSProgress類型,傳的是NULL,這個參數是AFN框架用于監聽下載進度
NSProgress在iOS7.0引入,使用觀察者模式
其fractionCompleted屬性值變化時,通知其所有的觀察者
示例說明:
1)下載任務的創建啟動/繼續
2)KVO的響應方法
其中self.progressView是一個自定義的用于顯示下載進度的視圖對象
下載任務常遇狀況
狀況一:程序退出時,如何保存下載狀態
下載任務管理類,注冊成為以下UIApplication對象通知的響應者
UIApplicationDidEnterBackgroundNotification
UIApplicationWillTerminateNotification
響應方法實現:將所有的下載任務暫停,并將斷點信息保存到本地的操作
響應下面通知,從本地讀出斷點信息的操作
UIApplicationWillEnterForegroundNotification
或在下載任務管理對象被創建時,從本地讀出斷點信息的操作
狀況二:從斷點繼續下載時,如果服務器上的文件發生變化或被刪除,應如何處理?
可以在從斷點繼續下載前,先發送一次HEAD請求,判斷文件是否存在,以及該文件的長度是否發生變化等操作。
感謝各位的閱讀!關于“iOS如何實現文件下載”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享文章:iOS如何實現文件下載-創新互聯
文章來源:http://vcdvsql.cn/article32/ddggsc.html
成都網站建設公司_創新互聯,為您提供移動網站建設、面包屑導航、服務器托管、外貿建站、電子商務、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯