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

时间: 2025-01-13 20:11:49

NSURLSessionDataTask的相关文章

iOS https请求 NSURLSessionDataTask

// //  YKSHttpsRequest.m //  YKShareSdkDemo // //  Created by qingyun on 22/05/2017. //  Copyright © 2017 qingjoin. All rights reserved. // #import "YKSHttpsRequest.h" @implementation YKSHttpsRequest + (YKSHttpsRequest *)requestWithString:(NSStr

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

#import "ViewController.h" #define FileName @"121212.mp4" @interface ViewController ()<NSURLSessionDataDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *proessView; /** 接受响应体信息 */ @property (nonatomic, strong) NSFile

iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> //输出流 @property (nonatomic, strong) NSOutputStream *stream ; //Task对象 @property (nonatomic, strong) NSURLSessionDataT

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

实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件名(经过MD5加密过的URL,Url保证了文件名的唯一) Value:该文件已经下载过的长度.保存成plist文件,方便对下载文件的判断 利用NSOutUpStream写文件 在任务完成的代理方法里面,NSOutUpStream关闭并且清空,对应的task清空,对应的session清空 代码如下:

ios:NSURLSessionDataTask做文件断点下载

之前用afn2.x的AFHttpOperation结合sqlite数据库管理做了文件的断点下载功能,之后苹果宣布要开始限制ipv4,不过AFN的东西时给予high-level的APIs的,因此不需要修改,但是国外的开发者建议使用AFN3.0版本. 闲来无事就想重新集成一下,迁移AFN3.0的时候因为没有了HTTPOperation,所以在修改代码的时候全部用NSURLSessionDowonloadTask代替,不过由于之前的数据库逻辑已经定型,且多处使用,修改起来比较复杂,DownloadTa

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

6.1 涉及知识点 (1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputStream *stream = [[NSOutputStream alloc]initWithURL:[NSURL fileURLWithPath:[self fullPath]] append:YES]; //2. 打开流 [stream open]; //3. 写入流数据 [stream wri

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

新浪微博客户端(18)-集成下拉刷新控件UIRefreshControl

HomeViewController.m - (void)setupPullToRefreshView { UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refreshNewData:) forControlEvents:UIControlEventValueChanged]; [self.tableView a

AFNetworking 3.0x版本最新特性

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库.为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持.如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本.本指南将引导您完成这个过程. 本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构. 新设备要求: iO