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的使用的更多相关文章

  1. [OC] NSURLSession

    有的程序员老了,还没听过NSURLSession 有的程序员还嫩,没用过NSURLConnection 有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSUR ...

  2. NSURLSession详解

    导语 现在NSURLConnection在开发中会使用的越来越少,iOS9已经将NSURLConnection废弃,现在最低版本一般适配iOS7,所以也可以使用. NSURLConnection相对于 ...

  3. iOS开发之Alamofire源码解析前奏--NSURLSession全家桶

    今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...

  4. 网络第三节——NSURLSession

    有的程序员老了,还没听过NSURLSession有的程序员还嫩,没用过NSURLConnection有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSURLS ...

  5. iOS 学习 - 10下载(4) NSURLSession 会话 篇

    NSURLConnection通过全局状态来管理cookies.认证信息等公共资源,这样如果遇到两个连接需要使用不同的资源配置情况时就无法解决了,但是这个问题在NSURLSession中得到了解决.N ...

  6. iOS 学习 - 10下载(2) NSURLSession 图片 篇

    使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...

  7. 使用NSURLSession

    NSURLConnection在iOS9被宣布弃用,NSURLSession从13年发展到现在,终于迎来了它独步江湖的时代.NSURLSession是苹果在iOS7后为HTTP数据传输提供的一系列接口 ...

  8. NSURLSession学习笔记

    NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...

  9. iOS 网络请求NSURLSession

    iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...

随机推荐

  1. ES6 -箭头函数 ,对象的函数解构

    ES6 -箭头函数: //es6 中的箭头函数和扩展 //es5的写法 // function add(a,b){ // return a + b; // } // add(1,2); //3 fun ...

  2. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之十一:SQL Server配置Always On后D365的配置更改

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  3. kali安装openvas

    参考: https://blog.51cto.com/linhong/2134910?source=drh https://www.freebuf.com/sectool/133425.html ht ...

  4. java 读取 excel 表格内容

    一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...

  5. 自己写的一个连数据库的音乐调用模块 MusicRj

    #自己定义 class MusicRj: # 创音乐表t_music # sql = '''CREATE TABLE t_music1( # id INT PRIMARY KEY AUTO_INCRE ...

  6. mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享

    转自:http://www.maomao365.com/?p=10278  摘要: 下文讲述sqlserver中将使用逗号组合的单列数据,分隔为多列数据的方法 实验环境:sql server 2012 ...

  7. 通过JTAG对比内核启动后text/rodata段内容

    关键词:vmlinux.strip.dump._text.__end_rodata等等. 在日常的调试中,可能会在某些情况下踩到内核重要的数据,比如代码段或者rodata之类. 这种情况下,需要确认这 ...

  8. 学习笔记:Django开发网上教育平台(参考了慕课网的教学视频)

    第一步:进行环境的搭建(用到的IDE:pycharm  ,数据库为mysql.nacicat.编辑语言python3.7.以及自己配置的虚拟环境venvpy37) Django==2.2​ ​ 配置好 ...

  9. SSH整合二

    结构图 articles模块 实体类Articles.java package com.jt.articles.entity; public class Articles { private Inte ...

  10. JVM-6-垃圾回收算法

    三如何垃圾回收   GC(Garbage Collection)垃圾回收算法 标记清除    速度快,但是会产生内存碎片: 标记整理    解决了标记清除内存碎片的问题,但是每次都得移动对象,因此成本 ...