您的位置:首页 > 理论基础 > 计算机网络

iOS网络-03-NSURLSession与NSURLSessionTask

2015-08-21 09:14 876 查看

简介

NSURLSession也能完成网络请求

NSURLConnection在iOS9中不推荐使用,NSURLSession是iOS9中推荐使用的网络请求方式

NSURLSession需要与NSURLSessionTask配合使用

NSURLSession的简单使用步骤

创建请求任务

执行请求任务

通常使用NSURLSessionTask的子类来创建任务

NSURLSession

NSURLSession对象的获取方法

获取全局的NSURLSession对象(
无法设置代理


+ (NSURLSession *)sharedSession


通过NSURLSessionConfiguration获取(
可以设置代理
),NSURLSessionConfiguration类通常用来设置一些请求参数

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue


NSURLSessionTask

常用的属性

taskIdentifier(NSUInteger, readonly),任务标识,唯一确定一个任务

originalRequest(NSURLRequest *, readonly),上一个请求对象

currentRequest(NSURLRequest *, readonly),当前请求对象

response(NSURLResponse *, readonly),服务器的响应数据

countOfBytesReceived(int64_t, readonly),已经接收到的数据量

countOfBytesExpectedToReceive(int64_t, readonly),所要接收到的总数据量

countOfBytesSent(int64_t, readonly),已经发送的数据量

countOfBytesExpectedToSend(int64_t, readonly),所要发送的总数据量

taskDescription(NSString *),任务描述

state(NSURLSessionTaskState, readonly),任务的状态

error(NSError *, readonly),错误信息

priority(float),任务的优先级

常用的方法(任务的状态控制)

- (void)cancel,取消任务

- (void)suspend,暂停任务

- (void)resume,继续任务

任务优先级属性priority的取值

NSURLSessionTaskPriorityDefault

NSURLSessionTaskPriorityLow

NSURLSessionTaskPriorityHigh

NSURLSessionTask

NSURLSessionDataTask,该子类没有扩充属性和方法,只是为了与NSURLSessionUploadTask和NSURLSessionDownloadTask区分

NSURLSessionUploadTask,用于上传任务

NSURLSessionDownloadTask,提供了一个取消任务的方法,但是会保存用于以后继续任务的信息,方法如下:

- (void)cancelByProducingResumeData:(void (^)(NSData * __nullable resumeData))completionHandler;


与NSURLSession相关的代理协议

NSURLSessionDelegate

NSURLSessionTaskDelegate,遵守NSURLSessionDelegate协议

NSURLSessionDataDelegate,遵守NSURLSessionTaskDelegate协议,
是网络请求通常遵循的协议
,常用的方法:

接受到服务响应时调用的方法

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
/**
* 必须在该方法中对服务器的响应进行授权,才能继续接收服务器返回的数据,调用如下函数
* completionHandler(NSURLSessionResponseAllow)
*/


接收到服务器返回的数据时调用的方法

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
/**
* data:服务返回的数据,通常为JSON格式数据
*/


请求完成时调用的方法(成功或失败)

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error
/**
* 若出现错误,error中存放错误信息
*/


NSURLSessionDownloadDelegate(
通常用于下载大量数据
),遵守NSURLSessionTaskDelegate协议,常用的方法:

写入数据到临时文件时调用的方法(服务器返回一点就写入一点)

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
/**
* totalBytesWritten,已写入数据的总长度
* totalBytesExpectedToWrite:总共要写入数据的总长度
* 可以在该方法中计算下载进度
*/


遇到错误的时候调用

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
/**
*error:若遇到错误,则保存错误信息
*/


用于断点下载的方法

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
/**
* fileOffset:继续下载时,文件的开始位置
* expectedTotalBytes:剩余的数据总数
*/


下载完成时调用的方法

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
/**
* location:下载的文件保存的临时位置
* 需要将下载的文件保存在可以长期保存的位置
*/


NSURLSession网络请求

Block回调的方式

获取NSURLSession对象

NSURLSession *session =[NSURLSession sharedSession];


创建请求任务

NSURLSessionTask *task = [session downloadTaskWithURL:(此处为请求的URL路径) completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//此处为请求任务完成后的回调Block,即:任务完成后会执行这里的代码
}];


启动任务

[task resume];


代理的方式

获得NSURLSession对象

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];


创建请求任务

NSURLSessionTask *task = [session dataTaskWithRequest:(此处为NSURLRequest对象)];


启动任务

[task resume];


实现代理方法做进一步处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: