说明:
本文将介绍NSURLSessionDataDelegate, 使用NSURLSessionDataDelegate方法实现下载数据. 博文底部会对文中所使用的方法有详细的介绍, 如果感兴趣可以仔细阅读.
session 类型 : default session.
session的创建方法: + sessionWithConfiguration:delegate:delegateQueue:
task 类型: data task.
代码中所使用到的接口(例:
http://c.3g.163.com/photo/api/list/0096/4GJ60096.json
) 都具有时效性, 建议测试时使用一个可以提供数据的新接口.文章中尽量不使用或少使用封装, 目的是让大家清楚为了实现功能所需要的官方核心API是哪些(如果使用封装, 会在封装外面加以注释)
此文章由 @春雨 编写. 经 @Scott,@黑子 审核. 若转载此文章,请注明出处和作者
iOS_NSURLSessionDataDelegate
核心API
Class :
- NSURLSession
- NSURLSessionConfiguration
- NSURLSessionTask
- NSURLSessionDataTask
- NSURLSessionDownload
Delegate :
- NSURLSessionDelegate
- NSURLSessionTaskDelegate
- NSURLSessionDataDelegate
- NSURLSessionDownloadDelegate
涉及的API :
- NSURLSession
/** 创建NSURLSession对象的类方法. */
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id<NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue
/** 通过URL, 返回一个数据任务. */
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url
/** 通过request请求, 返回一个数据任务. */
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
- NSURLSessionDataDelegate
/** 告诉delegate已经接受到服务器的初始应答, 准备接下来的数据任务的操作. */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
/** 告诉delegate已经接收到部分数据. */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
/** 告诉delegate, data task 已经转变成download task. */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask
- NSURLSessionTaskDelegate
/** 告诉delegate, task已经完成. */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
- NSURLSessionDownloadDelegate
/** 告诉delegate, download task已经完成. */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
功能实现
思路 :
- 正常实现data任务的下载.
- data任务转成download任务, 完成下载.
- 取消data任务下载.
Code :
一. 正常实现data任务的下载.
步骤1 :
/** 签订代理. */
@interface ViewController ()<NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
/** 设置一个NSMutableData类型的对象, 用于接收返回的数据. */
@property (nonatomic, retain) NSMutableData *allData;
@end
步骤3 : 创建会话和任务
- (void)handleData /*-> 自己定义的一个方法. */
{
/** 1. 创建NSURLSessionConfiguration类的对象, 这个对象被用于创建NSURLSession类的对象. */
NSURLSessionConfiguration *configura = [NSURLSessionConfiguration defaultSessionConfiguration];
/**
* 2. 创建NSURLSession的对象.
* 参数一 : NSURLSessionConfiguration类的对象.(第1步创建的对象.)
* 参数二 : session的代理人. 如果为nil, 系统将会提供一个代理人.
* 参数三 : 一个队列, 代理方法在这个队列中执行. 如果为nil, 系统会自动创建一系列的队列.
* 注: 只能通过这个方法给session设置代理人, 因为在NSURLSession中delegate属性是只读的.
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:configura delegate:self delegateQueue:nil];
/** 3. 创建URL. */
NSURL *url = [NSURL URLWithString:@