1. 程式人生 > >iOS-AFNetworking實現斷點續傳功能

iOS-AFNetworking實現斷點續傳功能

上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSession,想知道AFNet3.0和2.0的區別的所以在方法實現上面幾本一樣。至於AFNet怎麼利用CocoaPod獲取請移步到這裡

方法實現

1.宣告以下屬性變數

@property (nonatomic , strong) AFURLSessionManager *manager;
@property (nonatomic , strong
) NSURLSessionDataTask *downloadTask; @property (nonatomic , assign) NSInteger currentLength; @property (nonatomic , assign) NSInteger totalLength; @property (nonatomic , strong) NSFileHandle *fileHandle;

2.懶載入manager和downloadTask

建立會話管理者

- (AFURLSessionManager *)manager {
    if (!_manager) {
        NSURLSessionConfiguration *configuration
= [NSURLSessionConfiguration defaultSessionConfiguration]; _manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; } return _manager; }

建立下載任務

- (NSURLSessionDataTask *)downloadTask {
    if (!_downloadTask) {
        // 1.建立下載URL
        NSURL *url = [NSURL
URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; // 2.建立request請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 設定HTTP請求頭中的Range NSString *range = [NSString stringWithFormat:@"bytes=%zd-", self.currentLength]; [request setValue:range forHTTPHeaderField:@"Range"]; __weak typeof(self) weakSelf = self; _downloadTask = [self.manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { // 下載完成回撥block NSLog(@"完成"); // 清空長度 weakSelf.currentLength = 0; weakSelf.totalLength = 0; // 關閉fileHandle [weakSelf.fileHandle closeFile]; weakSelf.fileHandle = nil; }]; [self.manager setDataTaskDidReceiveResponseBlock:^NSURLSessionResponseDisposition(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSURLResponse * _Nonnull response) { NSLog(@"啟動任務"); // 每次喚醒task的時候會回撥這個block // 獲得下載檔案的總長度:請求下載的檔案長度 + 當前已經下載的檔案長度 weakSelf.totalLength = response.expectedContentLength + self.currentLength; // 沙盒檔案路徑 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"xxxxx"]; //NSLog(@"File downloaded to: %@",path); // 建立一個空的檔案到沙盒中 NSFileManager *manager = [NSFileManager defaultManager]; if (![manager fileExistsAtPath:path]) { // 如果沒有下載檔案的話,就建立一個檔案。如果有下載檔案的話,則不用重新建立(不然會覆蓋掉之前的檔案) [manager createFileAtPath:path contents:nil attributes:nil]; } // 建立檔案控制代碼 weakSelf.fileHandle = [NSFileHandle fileHandleForWritingAtPath:path]; // 允許處理伺服器的響應,才會繼續接收伺服器返回的資料 return NSURLSessionResponseAllow; }]; [self.manager setDataTaskDidReceiveDataBlock:^(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSData * _Nonnull data) { //NSLog(@"setDataTaskDidReceiveDataBlock"); // 一直回撥,直到下載完成 // 指定資料的寫入位置 -- 檔案內容的最後面 [weakSelf.fileHandle seekToEndOfFile]; // 向沙盒寫入資料 [weakSelf.fileHandle writeData:data]; // 拼接檔案總長度 weakSelf.currentLength += data.length; // 獲取主執行緒,不然無法正確顯示進度。 NSOperationQueue* mainQueue = [NSOperationQueue mainQueue]; [mainQueue addOperationWithBlock:^{ // 下載進度 NSLog(@"當前下載進度:%.2f%%",100.0 * weakSelf.currentLength / weakSelf.totalLength); }]; }]; } return _downloadTask; }

啟動任務

[self.downloadTask resume];

暫停任務

   [self.downloadTask suspend];
   self.downloadTask = nil;

到這裡AFNetworking斷點續傳就完成了,至於多工下載原理一樣的。

相關推薦

iOS-AFNetworking實現斷點功能

上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSess

iOS-NSURLSessionDataTask實現斷點功能

平時專案開發中,經常遇到下載視訊、語音、圖片等等,其中斷點續傳是最常見的,當然這也是根據產品需求而定的,如果檔案很小,就用不到斷點,嗖地一下就下載好了。 斷點續傳可以用蘋果原生的方法,也可以用AFNetworking。 本節先講蘋果原生的檔案下載方法,這裡需

5.2 SpringBoot實現斷點功能 > 我的程式猿之路:第四十二章

  功能使用webuploader元件分片下載檔案 文件地址: http://fex.baidu.com/webuploader/document.html 從  http://fex.baidu.com/webuploader/download.html中下載 用到的是:

自己主動升級系統的設計與實現2) -- 添加斷點功能 (附最新源代碼)

blog down 決定 top lin dom itl com 關於 一.緣起      之前已經寫了兩篇關於自己主動升級系統OAUS的設計與實現的文章(第一篇、第二篇)。在為OAUS服務端添加自己主動檢測文件變更的功能(這樣每次部署版本號升級時,能夠節省非常多時間。

WebUploader 實現大檔案的斷點功能

       斷點續傳指的是在下載或上傳時,將下載或上傳任務(一個檔案或一個壓縮包)人為的劃分為幾個部分,每一個部分採用一個片段進行上傳或下載,如果碰到網路故障,可以從已經上傳或下載的部分開始繼續上傳下載未完成的部分,而沒有必要從頭開始上傳下載。使用者可以節省

iOS實現斷點

網路下載是我們在專案中經常要用到的功能,如果是小檔案的下載,比如圖片和文字之類的,我們可以直接請求源地址,然後一次下載完畢。但是如果是下載較大的音訊和視訊檔案,不可能一次下載完畢,使用者可能下載一段時間,關閉程式,回家接著下載。這個時候,就需要實現斷點續傳的功能。讓使用者可以隨時暫停下載,下次開始下

Java servlet 簡單實現http檔案下載斷點功能

斷點續傳,聽上去似乎是個比較高階的話題,本文只講述一下http版的斷點續傳,其他協議的大家可以自行研究。 http協議中,服務端實現斷點續傳首先需要讀取客戶端傳送的Range頭資訊,比如“Range: bytes=12583394-”這個就是指原來正在下載的檔案需要從第12

Java實現斷點功能

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; impor

自動升級系統的設計與實現2) -- 增加斷點功能 (附最新原始碼)

一.緣起       之前已經寫了兩篇關於自動升級系統OAUS的設計與實現的文章(第一篇、第二篇),在為OAUS服務端增加自動檢測檔案變更的功能(這樣每次部署版本升級時,可以節省很多時間,而且可以避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:為OAUS增加斷點續傳功能。因為如果網路狀態不是

檔案上那些事兒:多圖上、大檔案上斷點功能實現與分析

簡介 看了不少的教程,在系統整合搭建的過程中一般寫到檔案上傳這一節時,基本上實現一個檔案上傳功能就不再繼續拓展,而是就此截止轉而去講解其他的內容了,因為企業級應用開發中這些功能肯定會使用到,企業網站的檔案上傳不可能只有一個單圖上傳,也不可能不實現大檔案的功能處

IOS 下載檔案斷點原理與實現(附原始碼)

在網路狀況不好的情況下,對於檔案的傳輸,我們希望能夠支援可以每次傳部分資料。首先從檔案傳輸協議FTP和TFTP開始分析, FTP是基於TCP的,一般情況下建立兩個連線,一個負責指令,一個負責資料;而TFTP是基於UDP的,由於UDP傳輸是不可靠的,雖然傳輸速度很快,但對於普通的檔案像PDF這種,少了一個

MongoDB全量遷移斷點功能學習與實現

1.    背景  MongoDB是一個基於分散式檔案儲存的開源資料庫系統,使用者儲存文字資料。MongoDB提供了一個面向文件的儲存,操作起來比較簡單容易,查詢速度快等特點。資料遷移是資料庫工作中經常見到的一個場景,比如擴容、備份、上雲等需求,資料遷移包括全量遷移和增量遷

用AsyncTask實現斷點

asynctask實現文件下載與斷點續傳 在學習四大組件之一的service時,正好可以利用asyncTask 和OKhttp來進行斷點續傳,並在手機的前臺顯示下載進度。 嘗試下載的是Oracle官網上的jdk1.7 在AS中使用OKhttp,只需要簡單的在app/build.grad

dropzone.js重寫斷點功能

jsjs文件:var uploaddropzone = new Dropzone("#uploaddropzone",{ url: ctx + "/slider/fileUploadContinue", acceptedFiles: "", maxFiles: 1, autoDiscover

rsync 實現斷點

direct pan 悲劇 文件 byte font scp命令 size receive Linux 主機之間即時傳送文件,scp命令大家都很熟悉但當要傳送的文件較大,過程中如果網絡中斷了,就比較悲劇了。這時候可以考慮使用rsync命令替代scp,實現斷點續傳文件。 試驗

用Java實現斷點 (HTTP)

斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求伺服器上的一個文時,所發出的請求如下: 假設伺服器域名為 www.sjtu.edu.cn,檔名為 down.zip。 GET /down.zip HTTP/1

【Flume】flume檔案監控的source元件開發,增量傳輸檔案內容,支援斷點功能

基於flume-ng中原有exec的source型別,通過tail依賴於作業系統去監聽檔案內容變化,其次,不支援斷點續傳的功能,特此,自行開發了一個元件,大家可以看看,一起探討: 該元件特點如下: 1、一個source對應一個檔案監控 2、實時監控檔案變化 3、增量傳輸檔

java多執行緒實現斷點下載

public class DownloadThread extends Thread {private int id;private int startindex;private int endindex;private String path;static int threadfinishedcount=0

Python實現斷點下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!

這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。 環境 Python 3.6 requests模組 對應檔案的下載連結 (要下載的檔案必須支援斷點續傳) (是不是很少東西

簡單實現斷點+MVP+Retrofit+RxJava

依賴: compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.s