1. 程式人生 > >NSURLSession實現大文件下載,使用NSFileHandle實現一邊接收數據,一邊存到沙盒

NSURLSession實現大文件下載,使用NSFileHandle實現一邊接收數據,一邊存到沙盒

director hand eve tin ota expect fff conf self.

NSURLSession實現大文件下載,使用NSFileHandle實現一邊接收數據,一邊存到沙盒

//文件句柄(指針) NSFileHandle實現邊接收邊寫數據到沙盒中

/*

特點:在寫數據的時候邊寫數據邊移動位置

使用步驟:

(1)創建空的文件

(2)創建文件句柄指針指向該文件

(3)當接收到數據的時候,使用該句柄來寫數據

(4)當所有的數據寫完,應該關閉句柄指針

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDataDelegate>

@property (nonatomic, assign) NSInteger totalSize;  
//文件的總大小 @property (nonatomic, assign) NSInteger currentSize; //當前已經下載的數據大小 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; @property (nonatomic, strong) NSFileHandle *handle; @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{ //01 確定資源路徑 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; //02 創建請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //03 創建會話對象 設置代理 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate
:self delegateQueue:[NSOperationQueue mainQueue]]; //04 創建下載請求Task NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; //05 發送請求 [dataTask resume]; } #pragma mark ----------------------- #pragma mark NSURLSessionDataDelegate //01 接收到響應的時候調用 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { //得到本次請求的文件數據大小 self.totalSize = response.expectedContentLength; //0 拼接獲取文件的存儲路徑 //得到文件的名稱:得到請求的響應頭信息,獲取響應頭信息中推薦的文件名稱 NSString *fileName = [response suggestedFilename]; NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; //拼接文件的存儲路徑(沙盒路徑cache) + 文件名 NSString *fullPath = [cache stringByAppendingPathComponent:fileName]; //(1)創建空的文件 [[NSFileManager defaultManager] createFileAtPath:fullPath contents:nil attributes:nil]; //(2)創建文件句柄指針指向該文件 self.handle = [NSFileHandle fileHandleForWritingAtPath:fullPath]; //告訴系統應該接收數據 completionHandler(NSURLSessionResponseAllow); } //02 接收到服務器返回數據的時候調用 可能會調用多次 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { //(3)當接收到數據的時候,使用該句柄來寫數據 [self.handle writeData:data]; //計算進度 self.currentSize +=data.length; NSLog(@"%f",1.0 * self.currentSize / self.totalSize); self.progressView.progress = self.currentSize / self.totalSize; } //03 下載完成或者是失敗的時候調用 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { // (4)當所有的數據寫完,應該關閉句柄指針 [self.handle closeFile]; } //文件句柄(指針) NSFileHandle實現邊接收邊寫數據到沙盒中 /* 特點:在寫數據的時候邊寫數據邊移動位置 使用步驟: (1)創建空的文件 (2)創建文件句柄指針指向該文件 (3)當接收到數據的時候,使用該句柄來寫數據 (4)當所有的數據寫完,應該關閉句柄指針 */ @end

NSURLSession實現大文件下載,使用NSFileHandle實現一邊接收數據,一邊存到沙盒