NSURLSessionDataTask
#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的更多相关文章
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...
- iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)
前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...
- iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...
- iOS https请求 NSURLSessionDataTask
// // YKSHttpsRequest.m // YKShareSdkDemo // // Created by qingyun on 22/05/2017. // Copyright © ...
- ios断点续传:NSURLSession和NSURLSessionDataTask实现
苹果提供的NSURLSessionDownloadTask虽然能实现断点续传,但是有些情况是无法处理的,比如程序强制退出或没有调用 cancelByProducingResumeData取消方法,这时 ...
- ios开发网络学习十一:NSURLSessionDataTask离线断点下载(断点续传)
#import "ViewController.h" #define FileName @"121212.mp4" @interface ViewControl ...
- 使用NSURLSessionDataTask实现大文件离线断点下载(完整)
6.1 涉及知识点(1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputSt ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
随机推荐
- [译] 什么是移动友好的 - Mobile-friendliness
什么是移动友好的? 移动友好到底意味着什么取决于您与谁讨论它. 我们不妨这样理解: 移动友好的设计以 表现力, 内容和性能 三方面为目标来改善用户体验. 表现力 - Presentation ...
- String对象
<script type="text/javascript"> /* var str1 = new String("hello"); var str ...
- for-in语句
<script type="text/javascript"> /* for-in语句: for-in语句的格式: for(var 变量名 in 遍历的目标){ } f ...
- Java基础学习第二天
================每日必读==================== 写代码: 1.明确需求.我需要实现什么需求? 2.分析思路.我需要怎么实现需求? 3.确定步骤.我的每一部分思路需要使 ...
- Android 字体颜色变化(点击)
在开发的过程中,经常会遇到这样的场景,点击按钮,背景颜色发生变化:在drawable中,定义xxx.xml(selector) <selector xmlns:android="htt ...
- Altium Designer 画"差分线"
如何在 Altium Designer 中快速进行差分对走线1:在原理图中让一对网络前缀相同,后缀分别为_N 和_P,并且加上差分队对指示. 让一对差分网络名称的前缀必须相同,后缀分别为_N 和 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- iOS 9之3D Touch
金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...
- 多个ajax按照顺序执行的方法
$.ajax({ dataType: "json", async: false, //只需将此属性设置为false url: ~~, type: "GET", ...
- 2014-08-13 SQL语句之Left Join
今天是在吾索实习的第26天.这天在处理数据库数据的时候发现了一个不错的语句就是Left Join,即左连接. 其功能是:即使右表中没有匹配,也从左表返回所有的行.也就是说,显示的行数与左表一致,且当 ...