使用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;
}