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相关的代理协议
NSURLSessionDelegateNSURLSessionTaskDelegate,遵守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];
实现代理方法做进一步处理
相关文章推荐
- AFN三方文件 监测网络状态 请求网络数据
- 问题:request.Headers;结果:HttpWebRequest.Headers 属性
- MFC笔记:TCP Socket通信
- http statusCode(状态码) 200、300、400、500序列
- Win10系统无线网络连接上了但电脑用不了网怎么解决?
- centos7的网络配置以及设置主机名和绑定IP的问题
- centos7的网络配置以及设置主机名和绑定IP的问题
- linux学习笔记4:linux的任务调度,进程管理,mysql的安装和使用,ssh工具的使用,linux网络编程
- linux学习笔记3:linux的网络配置,rpm包,shell以及samba服务器的使用和安装
- 网络语音视频技术浅议(附多个demo源码下载)
- 【网络流量-二部图最大匹配】poj3041Asteroids
- Xcode 7 App Transport Security has blocked a cleartext HTTP 报错解决办法
- C-BlogServer博客-可并发的http服务器
- 重写IHttpHandler,实现前后端分离
- iOS网络监控— BMReachability
- TCP/IP协议学习(三) STM32中ETH驱动配置注意事项
- SQL Server 建立连接时出现与网络相关的或特定于实例的错误
- No mapping found for HTTP request with URI
- Expected MultipartHttpServletRequest: is a MultipartResolver configured?
- IP地址理解_IP地址=网络地址+主机地址,但是具体前面多少是网络地址看题目说明