使用NSURLSession發起的網絡請求都當成任務,分為三種任務:
- NSURLSessionDataTask: 基本數據請求任務
- NSURLSessionDownloadTask: 下載任務,支持后臺下載和暫停續傳
- NSURLSessionUploadTask: 上傳任務,支持后臺上傳和暫停續傳
所有的任務都是有Session發起的,默認所有的任務都是"掛起"的,需要resume才會執行
dataTask基本數據請求
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/data.json"];
//1.創建全局單例
NSURLSession *session = [NSURLSession sharedSession];
//2.所有的任務由session發起
NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//3.反序列化,json數據
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@",result);
}];
//4.啟動任務
[task resume];
downLoadTask下載任務
- (NSURLSession *)session {
if (!_session) {
//config 提供了一個全局的網絡環境配置,包括:身份驗證,瀏覽器類型,cookie,緩存,超時...
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
}
return _session;
}
NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
//downloadTask下載
//如果需要跟進下載進度progress,不能使用Block回調方式
[[self.session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//文件路徑,存在temp文件夾中
NSLog(@"%@",location);
//下載zip包解壓縮操作
//......
}] resume];
注意: 如果在回調Block方法中,不做任何處理,下載的文件放在temp文件夾里,馬上會自動刪除,系統自動回收這塊區域! 設計的目的是什么?
- 通常從網絡上下載文件,什么格式文件最多 -> zip 文件最多!可以替用戶節約流量!
- 如果是 zip 包,下載之后,需要解壓
- 解壓縮之后,原始的 zip 文件就不在需要了.系統會自動幫我們刪除!
跟進下載進度,需要實現NSURLSessionDownloadDelegate代理方法
NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
//注意:如果要跟進下載進度,不能使用Block回調方式,負責代理方法不執行
[[self.session downloadTaskWithURL:url] resume];
/// MARK: - NSURLSessionDownloadDelegate代理
//iOS 7.0以前,三個方法都必須時間
//1.下載完成方法 iOS 8.0以后 這個方法必須實現
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSLog(@"%@",location);
}
//2.下載進度監聽方法
/**
bytesWritten 本次下載的字節數
totalBytesWritten 已經下載的字節數
totalBytesExpectedToWrite 文件的總大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
//下載進度
float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
NSLog(@"%f",progress);
//主線程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
//NSLog(@"%@",[NSThread currentThread]);
self.progressLabel.text = [NSString stringWithFormat:@"%0.0f%%",progress * 100];
self.progressView.progress = progress;
});
}
//3.下載續傳
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
}
續傳任務
//開始下載
- (IBAction)start:(id)sender {
NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
//downloadTask下載
self.downLoadTask = [self.session downloadTaskWithURL:url];
[self.downLoadTask resume];
}
//暫停
- (IBAction)stop:(id)sender {
NSLog(@"暫停");
[self.downLoadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
//resumeData 續傳數據
NSLog(@"下載數據的長度:%lu",resumeData.length);
self.resumeData = resumeData;
//釋放下載任務
self.downLoadTask = nil;
}];
}
//繼續
- (IBAction)resume:(id)sender {
if (self.resumeData == nil) {
NSLog(@"沒有暫停的任務");
return;
}
//續傳下載任務
self.downLoadTask = [self.session downloadTaskWithResumeData:self.resumeData];
//重新開啟任務
[self.downLoadTask resume];
//清空續傳數據
self.resumeData = nil;
}