原创blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的IOS-SDK讲解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:
这是IOS 网络开发系列的第三篇文章,这篇文章主要介绍了NSURLSession以及NSURLSessionTask这个抽象类,和NSURLSessionDataTask的使用和代理方法。
本篇的顺序,
1. demo效果
2. NSURLSessionTask属性方法介绍
3. NSURLSessionDataTask的使用和代理方法
4. Demo的源码讲解
一 Demo效果
暂停-继续
取消
三 NSURLSessionTask
Task是由Session创建的,Session会保持对Task的一个强引用,直到Task完成或者出错才会释放。通过NSURLSessionTask可以获得Task的各种状态,以及对Task进行取消,挂起,继续等操作。一共包括三种Task,三种Task的结构如图。本文主要讲解的是DataTask。
管理task的状态的方法
- (void)cancel //取消一个task
- (void)resume //如果task在挂起状态,则继续执行task
- (void)suspend //挂起task
获得task的执行情况的属性
countOfBytesExpectedToReceive
countOfBytesReceived
countOfBytesExpectedToSend
countOfBytesSent
task的综合信息
currentRequest // 当前活跃的request
originalRequest // 在task创建的时候传入的request(有可能会重定向)
response // 服务器对当前活跃请求的响应
taskDescription // 描述当前task
taskIdentifier // 用来区分Task的描述符
error //Task失败的错误信息
task状态的枚举
typedef NS_ENUM (NSInteger,
NSURLSessionTaskState ) {
NSURLSessionTaskStateRunning = 0,
NSURLSessionTaskStateSuspended = 1,
NSURLSessionTaskStateCanceling = 2,
NSURLSessionTaskStateCompleted = 3,
};
四 NSURLSessionDataTask代理
DataTask是用来干嘛的呢?
用来下载数据到内存里,数据的格式是NSData
dataTask使用的过程中,有两种方式来处理结果
第一种,通过block的方式(不关注过程,只关注结果,使用简单)
举个例子
下载一幅图片,完成后显示到ImageView。下面代码看起来很简单吧。
NSURLSessionDataTask * task = [self.session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
UIImage * image = [UIImage imageWithData:data];
self.imageview.image = image;
}
}];
[task resume];
第二种通过代理方法来管理session和task。( 可以获得全部过程,但是较为复杂)
主要使用到三种代理中的事件
NSURLSessionDelegate用来处理Session层次的事件
Session被 invalide得到的事件
- (void)URLSession: