#import "ViewController.h"

@interface ViewController ()<NSURLSessionDelegate,NSURLSessionTaskDelegate,NSURLSessionDataDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (weak, nonatomic) IBOutlet UIProgressView *progress;

@property (nonatomic,strong) NSURLSession * session;

@property (nonatomic,strong) NSURLSessionDataTask * dataTask;

@property (nonatomic,strong) NSMutableData * imageData;

@property (nonatomic,assign) long long length;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

}

-(NSURLSession *)session{

if (_session == nil) {

NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];

self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

}

return _session;

}

-(NSURLSessionDataTask *)dataTask{

if (_dataTask ==nil) {

NSURL * url = [NSURL URLWithString:@"http://img1.3lian.com/2015/a1/124/d/181.jpg"];

self.dataTask = [self.session dataTaskWithURL:url];

}

return _dataTask;

}

- (IBAction)suspendenButtonDidClicked:(UIButton *)sender {

if (self.dataTask.state == NSURLSessionTaskStateRunning) {

[self.dataTask suspend];

}

}

- (IBAction)resumeButtonDidClicked:(UIButton *)sender {

[self.dataTask resume];

}

- (IBAction)cancelButtonDidClicked:(UIButton *)sender {

if (_dataTask) {

if (self.dataTask.state == NSURLSessionTaskStateRunning||NSURLSessionTaskStateSuspended) {

[self.dataTask cancel];

self.dataTask=nil;

self.session = nil;

[self.progress setProgress:0 animated:NO];

}

}

}

//获取服务器返回的响应信息

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{

//转换

NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;

NSLog(@"%@",[httpResponse allHeaderFields]);

//获取资源大小

self.length = httpResponse.expectedContentLength;

NSLog(@"responce");

if (_length!=-1) {

//继续下载或上传

self.imageData = [NSMutableData dataWithCapacity:(NSUInteger)_length];

completionHandler(NSURLSessionResponseAllow);

}else{

completionHandler(NSURLSessionResponseCancel);

[self.dataTask cancel];

self.dataTask = nil;

}

}

//一个数据包过来了

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data{

NSLog(@"receive data");

//将当前的数据添加到imageData中

[self.imageData appendData:data];

float rate = data.length/(_length*1.0);

[self.progress setProgress:(_progress.progress +rate) animated:NO];

}

//下载完毕

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

NSLog(@"complete");

if (error) {

NSLog(@"error");

}else{

UIImage * img = [UIImage imageWithData:_imageData];

self.imageView.image = img;

}

self.session = nil;

self.dataTask = nil;

}

@end

NSURLSessionDataTask的更多相关文章

  1. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  2. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  3. iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传

    实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...

  4. iOS https请求 NSURLSessionDataTask

    // //  YKSHttpsRequest.m //  YKShareSdkDemo // //  Created by qingyun on 22/05/2017. //  Copyright © ...

  5. ios断点续传:NSURLSession和NSURLSessionDataTask实现

    苹果提供的NSURLSessionDownloadTask虽然能实现断点续传,但是有些情况是无法处理的,比如程序强制退出或没有调用 cancelByProducingResumeData取消方法,这时 ...

  6. ios开发网络学习十一:NSURLSessionDataTask离线断点下载(断点续传)

    #import "ViewController.h" #define FileName @"121212.mp4" @interface ViewControl ...

  7. 使用NSURLSessionDataTask实现大文件离线断点下载(完整)

    6.1 涉及知识点(1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputSt ...

  8. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  9. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

随机推荐

  1. input 类型为number型时,maxlength不生效?

    input 类型为number型时,maxlength不生效? 可以加oninput属性来控制最大长度:<input id="numInput" type="num ...

  2. php开发通用采集程序

    php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新 ...

  3. java-Mysql-SQLServer数据类型匹配速查表

    java-Mysql-SQLServer数据类型匹配速查表 Mysql ************************************ 当前列 ClassName ColumnType Di ...

  4. 探讨VMP 2.12.3 导入表修复

    壳版本:VMProtect.Ultimate.2.12.3 样本:notepad.exe 目的:IAT修复 作者:MrWrong 标题:探讨VMP 2.12.3 导入表修复 只是感兴趣,没有其他目的. ...

  5. UNIQUE NullAble

    一般情况 UNIQUE 不应该出现nullable的 但是如果我们要支持也是有办法的,就是写一个filter. https://msdn.microsoft.com/en-us/library/ms1 ...

  6. MySQL中的concat函数

    select concat('数据库',cast('aa' as char),'查询') as str

  7. 关于C51的中断函数要注意的几个问题

    转载自:http://blog.21ic.com/user1/531/archives/2006/16909.html 最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖 ...

  8. 交叉编译环境以及开发板上-/bin/sh: ./hello: not found(使用arm-linux-gcc -static -o 来进行静态编译)

    目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的”Hello,World!”. 一. 主机编译环节 我使用的系统是ubuntu10 ...

  9. Calling a Web API From a .NET Client (C#)

    on|January 20, 2014 1760 of 2013 people found this helpful Print Download Completed Project This tut ...

  10. uniq 命令

    uniq 命令 文字 uniq是LINUX命令 用途 报告或删除文件中重复的行. 语法 uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ ...