亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發-實現大文件下載與斷點下載思路

2020-07-26 02:58:48
字體:
來源:轉載
供稿:網友

大文件下載

方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建議使用)

相關變量:

 @property (nonatomic,strong) NSFileHandle *writeHandle;@property (nonatomic,assign) long long totalLength; 

1>發送請求

// 創建一個請求  NSURL *url = [NSURL URLWithString:@""];  NSURLRequest *request = [NSURLRequest requestWithURL:url];  // 使用NSURLConnection發起一個異步請求  [NSURLConnection connectionWithRequest:request delegate:self]; 

2>在代理方法中處理服務器返回的數據

/** 在接收到服務器的響應時調用下面這個代理方法  1.創建一個空文件  2.用一個句柄對象關聯這個空文件,目的是方便在空文件后面寫入數據*/- (void)connection:(NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response{  // 創建文件路徑  NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];  NSString *filePath = [caches stringByAppendingPathComponent:@"videos.zip"];    // 創建一個空的文件到沙盒中  NSFileManager *mgr = [NSFileManager defaultManager];  [mgr createFileAtPath:filePath contents:nil attributes:nil];    // 創建一個用來寫數據的文件句柄  self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];    // 獲得文件的總大小  self.totalLength = response.expectedContentLength;}/** 在接收到服務器返回的文件數據時調用下面這個代理方法  利用句柄對象往文件的最后面追加數據 */- (void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data{  // 移動到文件的最后面  [self.writeHandle seekToEndOfFile];    // 將數據寫入沙盒  [self.writeHandle writeData:data];}/**  在所有數據接收完畢時,關閉句柄對象 */- (void)connectionDidFinishLoading:(NSURLConnection *)connection{  // 關閉文件并清空  [self.writeHandle closeFile];  self.writeHandle = nil;} 

方案二:使用NSURLSession的NSURLSessionDownloadTask和NSFileManager

NSURLSession *session = [NSURLSession sharedSession];  NSURL *url = [NSURL URLWithString:@""];  // 可以用來下載大文件,數據將會存在沙盒里的tmp文件夾  NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {    // location :臨時文件存放的路徑(下載好的文件)        // 創建存儲文件路徑    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];    // response.suggestedFilename:建議使用的文件名,一般跟服務器端的文件名一致    NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];        /**將臨時文件剪切或者復制到Caches文件夾     AtPath :剪切前的文件路徑     toPath :剪切后的文件路徑     */    NSFileManager *mgr = [NSFileManager defaultManager];    [mgr moveItemAtPath:location.path toPath:file error:nil];  }];  [task resume]; 

方案三:使用NSURLSessionDownloadDelegate的代理方法和NSFileManger

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  // 創建一個下載任務并設置代理  NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];  NSURLSession *session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];    NSURL *url = [NSURL URLWithString:@""];  NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];  [task resume];}#pragma mark - /**  下載完畢后調用  參數:lication 臨時文件的路徑(下載好的文件) */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location{  // 創建存儲文件路徑  NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];  // response.suggestedFilename:建議使用的文件名,一般跟服務器端的文件名一致  NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];    /**將臨時文件剪切或者復制到Caches文件夾   AtPath :剪切前的文件路徑   toPath :剪切后的文件路徑   */  NSFileManager *mgr = [NSFileManager defaultManager];  [mgr moveItemAtPath:location.path toPath:file error:nil];}/**  每當下載完一部分時就會調用(可能會被調用多次)  參數:    bytesWritten 這次調用下載了多少    totalBytesWritten 累計寫了多少長度到沙盒中了    totalBytesExpectedToWrite 文件總大小 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask   didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{  // 這里可以做些顯示進度等操作}/**  恢復下載時使用 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes{  // 用于斷點續傳} 

斷點下載

方案一:

1>在方案一的基礎上新增兩個變量和按扭

@property (nonatomic,assign) long long currentLength;@property (nonatomic,strong) NSURLConnection *conn; 

2>在接收到服務器返回數據的代理方法中添加如下代碼

  // 記錄斷點,累計文件長度  self.currentLength += data.length; 

3>點擊按鈕開始(繼續)或暫停下載

- (IBAction)download:(UIButton *)sender {    sender.selected = !sender.isSelected;    if (sender.selected) { // 繼續(開始)下載    NSURL *url = [NSURL URLWithString:@""];    // ****關鍵點是使用NSMutableURLRequest,設置請求頭Range    NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];        NSString *range = [NSString stringWithFormat:@"bytes=%lld-",self.currentLength];    [mRequest setValue:range forHTTPHeaderField:@"Range"];        // 下載    self.conn = [NSURLConnection connectionWithRequest:mRequest delegate:self];  }else{    [self.conn cancel];    self.conn = nil;  }} 

4>在接受到服務器響應執行的代理方法中第一行添加下面代碼,防止重復創建空文件

 if (self.currentLength) return; 

方案二:使用NSURLSessionDownloadDelegate的代理方法

所需變量

 @property (nonatomic,strong) NSURLSession *session;@property (nonatomic,strong) NSData *resumeData; //包含了繼續下載的開始位置和下載的url@property (nonatomic,strong) NSURLSessionDownloadTask *task; 

方法

// 懶加載session- (NSURLSession *)session{  if (!_session) {    NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];    self.session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];  }  return _session;}- (IBAction)download:(UIButton *)sender {    sender.selected = !sender.isSelected;  if (self.task == nil) { // 開始(繼續)下載    if (self.resumeData) { // 原先有數據則恢復      [self resume];    }else{      [self start]; // 原先沒有數據則開始    }  }else{ // 暫停    [self pause];  }}// 從零開始- (void)start{  NSURL *url = [NSURL URLWithString:@""];  self.task = [self.session downloadTaskWithURL:url];  [self.task resume];}// 暫停- (void)pause{  __weak typeof(self) vc = self;  [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {    //resumeData : 包含了繼續下載的開始位置和下載的url    vc.resumeData = resumeData;    vc.task = nil;  }];}// 恢復- (void)resume{  // 傳入上次暫停下載返回的數據,就可以回復下載  self.task = [self.session downloadTaskWithResumeData:self.resumeData];  // 開始任務  [self.task resume];  // 清空  self.resumeData = nil;}#pragma mark - NSURLSessionDownloadDelegate/**  下載完畢后調用  參數:lication 臨時文件的路徑(下載好的文件) */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location{  // 創建存儲文件路徑  NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];  // response.suggestedFilename:建議使用的文件名,一般跟服務器端的文件名一致  NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];    /**將臨時文件剪切或者復制到Caches文件夾   AtPath :剪切前的文件路徑   toPath :剪切后的文件路徑   */  NSFileManager *mgr = [NSFileManager defaultManager];  [mgr moveItemAtPath:location.path toPath:file error:nil];}/**  每當下載完一部分時就會調用(可能會被調用多次)  參數:    bytesWritten 這次調用下載了多少    totalBytesWritten 累計寫了多少長度到沙盒中了    totalBytesExpectedToWrite 文件總大小 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask   didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{  // 這里可以做些顯示進度等操作}/**  恢復下載時使用 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes{}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费高清完整版在线观看| 欧美成人免费播放| 亚洲娇小xxxx欧美娇小| 亚洲字幕在线观看| 亚洲人高潮女人毛茸茸| 亚洲欧美日韩视频一区| 97**国产露脸精品国产| 国内精品伊人久久| 亚洲人成五月天| 亚洲激情第一页| 欧美精品生活片| 精品视频在线播放| 成人免费视频在线观看超级碰| 日韩精品一二三四区| 欧美在线影院在线视频| 日本高清不卡在线| 伊人一区二区三区久久精品| 国产一区二区三区视频在线观看| 97在线日本国产| 丰满岳妇乱一区二区三区| 精品亚洲aⅴ在线观看| 亚洲最大av网| 欧美大尺度激情区在线播放| 成人黄色av网| 国产精品久久久久福利| 国产一区二区三区丝袜| 久久精品国产免费观看| 黑人极品videos精品欧美裸| 欧美电影免费观看高清| 91精品视频在线播放| 久久人人爽人人爽爽久久| 国产精品一区二区在线| 国产精品欧美日韩一区二区| 精品久久久久久久大神国产| 日韩在线视频国产| 青青久久av北条麻妃黑人| 精品亚洲国产成av人片传媒| 欧洲亚洲免费在线| 久久人人97超碰精品888| 欧美xxxx做受欧美| 精品视频在线播放色网色视频| 国产成人精品久久久| 97人洗澡人人免费公开视频碰碰碰| 国产又爽又黄的激情精品视频| 国产精品av网站| 国产成人综合精品| 国产精品91视频| 欧美日韩亚洲视频一区| 亚洲人高潮女人毛茸茸| 91在线免费网站| 久久久亚洲精品视频| 国产精品ⅴa在线观看h| 精品国产91乱高清在线观看| 欧美肥婆姓交大片| 68精品久久久久久欧美| 亚洲激情在线视频| 国产99视频在线观看| 欧美一区二区三区免费视| 日本久久久a级免费| 亚洲精品久久久久久久久久久久| 亚洲综合视频1区| 精品国产美女在线| 亚洲开心激情网| 欧美在线国产精品| 亚洲一级一级97网| 国产在线日韩在线| 亚洲电影在线观看| 亚洲肉体裸体xxxx137| 日韩精品极品在线观看播放免费视频| 高清欧美一区二区三区| 日韩精品在线观看一区| 久久久精品国产一区二区| 国产精品视频导航| 国产日本欧美视频| 97视频在线观看亚洲| 亚洲激情在线观看| 狠狠综合久久av一区二区小说| 欧美黑人极品猛少妇色xxxxx| 久久99视频免费| 亚洲精品午夜精品| 成人观看高清在线观看免费| 最近2019免费中文字幕视频三| 欧美成人精品三级在线观看| 久色乳综合思思在线视频| 国产成人免费91av在线| 欧美日韩国产黄| 91欧美精品成人综合在线观看| 国产精品流白浆视频| 91在线视频免费| 久久久久久久久爱| 精品人伦一区二区三区蜜桃免费| 亚洲一级免费视频| 91影院在线免费观看视频| 欧美另类交人妖| 欧美大片va欧美在线播放| 欧美日韩国产限制| 蜜臀久久99精品久久久无需会员| 欧美激情在线一区| 日韩av不卡在线| 国产精品盗摄久久久| 国产在线a不卡| 亚洲第一视频在线观看| 人人澡人人澡人人看欧美| 欧美影院成年免费版| 久久久人成影片一区二区三区| 亚洲人成人99网站| 亚洲国产精品va在线看黑人动漫| 91亚洲国产成人精品性色| 国产精品中文字幕在线| 久久影院在线观看| 欧美影院在线播放| 亚洲人成77777在线观看网| 亚洲欧美日韩第一区| 亚洲成人精品视频在线观看| 亚洲激情第一页| 欧美日韩亚洲一区二区| 欧美精品久久一区二区| 91国产精品视频在线| 一区二区三区动漫| 一本色道久久88综合亚洲精品ⅰ| 成人黄色免费看| 日韩有码片在线观看| 日韩欧美极品在线观看| 欧美美女操人视频| 久久久久一本一区二区青青蜜月| 亚洲成人av资源网| 日韩一区二区三区在线播放| 97在线视频免费播放| 中文字幕日韩免费视频| 97精品免费视频| 成人av在线天堂| 国产成人在线一区二区| 欧美久久精品一级黑人c片| 亚洲视频在线观看| 国产精品久久久久av| 欧美午夜片欧美片在线观看| 亚洲久久久久久久久久久| 亚洲3p在线观看| 成人欧美一区二区三区黑人| 68精品久久久久久欧美| 国产综合在线视频| 欧美成人免费小视频| 亚洲一级黄色av| 亚洲综合精品一区二区| 欧美电影在线播放| 亚洲综合精品伊人久久| 91探花福利精品国产自产在线| 最近日韩中文字幕中文| 欧美日韩国产在线| 午夜精品99久久免费| 亚洲精品免费av| 国产精品久久久久久久久久东京| 中国人与牲禽动交精品| 久久视频精品在线| 亚洲专区在线视频| 亚洲另类欧美自拍| 欧美性猛交xxxx免费看| 中文欧美日本在线资源| 日韩国产精品亚洲а∨天堂免| 国产精品一二三在线| 国产精品亚洲一区二区三区| 欧美性猛交99久久久久99按摩| 午夜精品久久久久久久久久久久| 国产亚洲a∨片在线观看|