#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. js 浏览器版本检测

    整理了一下浏览器检测的js脚本 分享给大家 浏览器检测一般都是在网页打开的时候执行 使用js的闭包来实现页面加载以后执行的脚本 (function(){ //页面加载后执行的脚本 })() ; 检测浏 ...

  2. Redis+PHP扩展的安装和Redis集群的配置 与 PHP负载均衡开发方案

    以前有想过用 Memcache 实现M/S架构的负载均衡方案,直到听说了 Redis 后才发现它做得更好.发了几天时间研究了一下 Redis ,感觉真的很不错,特整理一下! 以下操作都是在 SUSE  ...

  3. php empty和isset的区别

    通过一个例子来解释一下, $id = 0  empty($id) 的值是true isset($id) 也是true. empty 和isset 处理对象无外乎 未定义常量 .0 .空字符串 如果变量 ...

  4. php 学习路线 赵兴壮2014年4月28 日 加油

    第一阶段 第一讲,WEB基础     1.1 网站基本知识: 1.2 网络协议介绍: 1.3 B/S与C/S结构的区别: 1.4 WEB编程.网站开发技术介绍.      第二讲,网页设计     2 ...

  5. linux“批处理”脚本

    依次执行A B C3条语句 最简单的 写如下代码 #!/bin/sh A B C 保存为test.sh然后添加执行权限chmod +x test.sh然后执行该脚本./test.sh

  6. Oracle 存储过程介绍

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  7. 一条sql,有分页,表合并查询,多表连接,用于oracle数据库

    SELECT * FROM ( SELECT TT.*,ROWNUM RN FROM ( SELECT A.CASE_ID AS TREATID, A.TYPE AS TYPE, B.CONTENT ...

  8. 宏定义 button 方法 --备

    定义 #define BARBUTTON(TITLE, SELECTOR) [[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButto ...

  9. reaver 使用方法和技巧

    reaver非常的不错,为我们ceng网带了最大的方便,使用简单,我来讲一下自己使用心得吧! 第一步,如果用虚拟机用vmware的,总会出现鼠标不灵点不到地方,换了一个 6.0.2 build-598 ...

  10. ALTIUM DESIGNER怎么定义差分对布线

    方法一:第一步是在原理图中声明,这样做的目的是为了让差分对布线器清楚哪两个网络是属于同一组差分对,设计编译器将查找格式为NETNAME_N和NETNAME_P(即以_N和_P为后缀)的两个同名网络.这 ...