#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. CentOS6.4 GOOGLE chrome install

    yum install http://people.centos.org/hughesjr/chromium/6/i386/RPMS/chromium-28.0.1500.45-205727.i686 ...

  2. php批量上传图片并把图片名放入数据库

    前几天工作中要做这样一个功能,有八百多个系统 生成的会员:给这八百多个系统会员上传图片:然后把图片名放入数据库. 第一步: 第一步肯定是首先把图片上传到对应的图片目录下,直接用框架中已经有的上传类: ...

  3. 如何解析复杂的C语言声明

    C语言中有时会出现复杂的声明,比如   char * const * (*next) (); //这是个什么东东?   在讲复杂声明的分析方法前,先来个补充点.   C语言变量的声明始终贯彻两点 :  ...

  4. 文成小盆友python-num13 整个堡垒机

    本节主要内容: 1.pymsql的使用 2.SQLAchemy使用 3.Paramiko 4.通过ORM功能使用和Paramiko的使用实现一个简单的堡垒机模型. 一.pymsql的使用 pymsql ...

  5. .NET MVC 插件化框架源码

    本来想把源码整理了放github上,但最近一直忙,就直接在这里放出来了,还写得不太完整,里面有几个例子,插件上传也没写,只写了插件zip包解压,如果大家在使用中有什么疑问,可以加QQ群:1429391 ...

  6. 正在搞用web.py做的通讯录

    正在搞用web.py做的通讯录,应该算是学习吧,学习那个web.py的应用框架,其实已经搞起来了,可以增删改数据了,查询还没可以用,现在正在搞登录认证的问题,久没用python, 但再上手后半小时就有 ...

  7. MSSQL显错注入爆数字型数据的一点思考

    Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其 ...

  8. AdHoc发布时出现重复Provisioning Profile的解决方案

    当在developer.apple.com更新Provisioning Profile(添加新机器)后,下载到本地,双击载入xcode,运行时没问题.但如果用adhoc发布,可能会发现重复的provi ...

  9. WebService实现文件上传下载

    一:服务端:一个普通java web工程 package com.wzh.file; import com.sun.xml.ws.developer.StreamingAttachment; impo ...

  10. C# and android

    http://www.cnblogs.com/GoodHelper/archive/2011/07/08/android_socket_chart.html http://blog.csdn.net/ ...