NSURLSession中的downloadTask的使用
1.用downloadTask下载图片
优点:简单
缺点:不能监听下载的进度
代码示例:
NSURL *url = [NSURL URLWithString:@"http://pic1.win4000.com/pic/b/03/21691230681.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//默认把数据写到磁盘中:tmp/...随时可能被删除
NSLog(@"location= %@", location); //转移文件
NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [cache stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"filePath = %@",filePath);
NSURL *toURL = [NSURL fileURLWithPath:filePath];
[[NSFileManager defaultManager] moveItemAtURL:location toURL:toURL error:nil];
}];
[downloadTask resume];
2.downloadTask下载比较大的文件
优点:已经解决内存飚升的问题
缺点:无法实现断点下载的功能
代码如下:
#import "ViewController.h" @interface ViewController ()<NSURLSessionDownloadDelegate> @property (nonatomic,strong) NSURLSession *session;
@property (nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
@property (nonatomic,strong) NSData *resumeData ; @end @implementation ViewController - (IBAction)startClick:(id)sender { [self.downloadTask resume];
} - (IBAction)suspendClick:(id)sender {
[self.downloadTask suspend];
} - (IBAction)cancleClick:(id)sender {
//用cancel的方法,操作不可以恢复
// [self.downloadTask cancel]; //取消,可以恢复的取消操作
//resumeDta可以用来恢复下载的数据
[self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
//data不是沙盒中已经下载好的数据
self.resumeData = resumeData;
}]; self.downloadTask = nil;
} - (IBAction)resumeClick:(id)sender {
//在恢复下载的时候,判断是否可以用来进行恢复下载的数据,如果有那么就根据该数据创建一个新的网络请求
if (self.resumeData) {
//取消 再恢复,在恢复的时候,需要重新创建
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
}
[self.downloadTask resume];
} - (NSURLSession *)session {
if (!_session) {
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}
return _session;
} - (NSURLSessionDownloadTask *)downloadTask {
if (!_downloadTask) {
NSURL *url = [NSURL URLWithString:@"http://meiye-mbs.oss-cn-shenzhen.aliyuncs.com/mbsFiles/0e3d0e4a0d5d4da5963e9e7617e8de101565841097849.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
_downloadTask = [self.session downloadTaskWithRequest:request];
}
return _downloadTask;
} #pragma mark - 代理
//01 写数据的时候调用
/**
bytesWritten:本次写入的数据大小
totalBytesWritten:写入数据的总大小
totalBytesExpectedToWrite:文件的总大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
NSLog(@"111111=%f", 1.0 * totalBytesWritten / totalBytesExpectedToWrite);
} //02 下载完成的时候调用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
//转移文件
NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [cache stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
NSLog(@"filePath = %@",filePath);
NSURL *toURL = [NSURL fileURLWithPath:filePath];
[[NSFileManager defaultManager] moveItemAtURL:location toURL:toURL error:nil];
} //03 整个请求结束或者失败的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"结束");
}
@end
NSURLSession中的downloadTask的使用的更多相关文章
- [OC] NSURLSession
有的程序员老了,还没听过NSURLSession 有的程序员还嫩,没用过NSURLConnection 有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSUR ...
- NSURLSession详解
导语 现在NSURLConnection在开发中会使用的越来越少,iOS9已经将NSURLConnection废弃,现在最低版本一般适配iOS7,所以也可以使用. NSURLConnection相对于 ...
- iOS开发之Alamofire源码解析前奏--NSURLSession全家桶
今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...
- 网络第三节——NSURLSession
有的程序员老了,还没听过NSURLSession有的程序员还嫩,没用过NSURLConnection有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSURLS ...
- iOS 学习 - 10下载(4) NSURLSession 会话 篇
NSURLConnection通过全局状态来管理cookies.认证信息等公共资源,这样如果遇到两个连接需要使用不同的资源配置情况时就无法解决了,但是这个问题在NSURLSession中得到了解决.N ...
- iOS 学习 - 10下载(2) NSURLSession 图片 篇
使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...
- 使用NSURLSession
NSURLConnection在iOS9被宣布弃用,NSURLSession从13年发展到现在,终于迎来了它独步江湖的时代.NSURLSession是苹果在iOS7后为HTTP数据传输提供的一系列接口 ...
- NSURLSession学习笔记
NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...
- iOS 网络请求NSURLSession
iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...
随机推荐
- CAD转PDF的软件哪个比较好用?用这两个很方便
大家都知道编辑CAD图纸是需要借助CAD制图软件来进行绘制的,而且CAD制图软件很多的设计师们都在使用.但是CAD中的图纸格式为dwg格式的,不想要使用CAD软件来查看图纸的话,就需要将CAD转换成P ...
- json对象中的变量存在空格的取值办法
写一个json对象,但需求需要是带空格的键,定义的话很容易定义,只需要双引号引起来即可,但取值的时候怎么取,直接写 会报错,所以就有了下边的办法 <el-form-item label=&quo ...
- Linux-正则、grep、sed学习笔记
一.正则和grep 正则表达式的实现分成了两类: 基本正则表达式(BRE)和扩展的正则表达式(ERE). BRE 和 ERE 之间有什么区别呢?这是关于元字符的问题.BRE 可以辨别以下元字符: ^ ...
- [20191101]完善vim的bccalc插件8.txt
[20191101]完善vim的bccalc插件8.txt --//今天移植bccalc插件到linux,发现一些问题.我自己已经在windows下使用一段时间,从来没有在linux下测试.看来很少人 ...
- Linux—chattr 命令详解
chattr命令的用法:chattr [ -RV ] [ -v version ] [ mode ] files…最关键的是[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu] ...
- MYSQL的基本使用,以及错误代码的意思
创建数据库: 要创建声明类型的数据库,输入CREATE DATABASE 数据库名称; 注意:命令不必以大写字母输入. 注意:所有MySQL命令必须以";"结束.如果忘记了输入分号 ...
- 我的朋友&值得学习的大佬
@media only screen and (max-width: 360px) { #friedsGroup { columns: 1 !important; } } #MySignature{ ...
- 201871020225-牟星源 《面向对象程序设计(java)》第一周学习总结
正文 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daiz ...
- 《专访 RocketMQ 联合创始人:项目思路、技术细节和未来规划》
专访 RocketMQ 联合创始人:项目思路.技术细节和未来规划 木环 阅读数:138092017 年 2 月 20 日 18:00 编者按 这些年开源氛围越来越好,各大 IT 公司都纷纷将一 ...
- Java的异常处理方式
一.异常简介 异常结构图 Throwable是类,Exception和Error都继承了该类,error是因为系统内部错误或者资源耗尽错误,这种情况很少出现,而且error也不允许被抛出在Except ...