OC - 15.NSURLSession与NSURLSessionTask
简介
- 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];
实现代理方法做进一步处理
OC - 15.NSURLSession与NSURLSessionTask的更多相关文章
- iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...
- Effective OC : 1-5
1,了解Objective-C语言的起源: OC为C语言的超集,为C加入了面向对象的特性. 要理解C中的指针和内存模型. 2.在类文件里尽量少引入其它头文件: 引入过多头文件.将借口暴露,添加耦合度. ...
- [swift]NSURLSession
一.简单说明 在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作. NSURLSession ...
- iOS网络学习之“远离NSURLConnection 走进NSURLSession”
目前,在iOS的开发中,NURLConnection已经成为了过去式,现在的NSURLConnection已经deprected(iOS7之后),取而代之的是NSURLSession.而且AFNetw ...
- NSURLSession、NSURLConnection
NSURLSesstion GET方法 block回调方法NSString * urlStr = @"http://192.168.1.247:8100/stream?cname=cha_2 ...
- iOS基础 - NSURLSession
使用URLSession所有的网络访问都是有缓存的,缓存文件自动保存在tmp文件夹中,URLSession本身实现的时候,就是少量多次的! l 使用defaultSessionConfiguratio ...
- swift开发网络篇—利用NSURLSession 发送GET和POST请求
说明:本文示例代码发送的请求均为http请求,需要对info.plist文件进行配置.如何配置,请参考https://github.com/HanGangAndHanMeimei/iOS9Adapta ...
- NSURLSession网络接口
URLSession URLSession NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的. 当程序在前台时,NSURLSession与NSURLConne ...
- AFNetworking 3.0 源码解读(五)之 AFURLSessionManager
本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
随机推荐
- 如何利用预编译指令来判断Delphi 的版本转载
条件符号 含义 VERxx 编译器版本,XX表示版本,例如:Delphi 1.0 的编译器版本为80.Delphi 5.0 的编译器版本为130WIN32 是否WIN32的运行环境(Windows 9 ...
- django 项目部署在 Apache 后, 设置二级域名(Apache虚拟主机 、 万网二级域名设置)
上一篇文章简单说了怎么把django的项目部署到Apache上. 现在想弄个二级域名,也就是我原来有个域名 www.mysite.com,现在我想弄个 bbs.mysite.com ,该怎么做呢. 要 ...
- linux 多线程基础4
六.线程的作用域 函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下: 7. 名称:: pthread_at ...
- 关于list 添加数据到指定下标
1 2 3 4 5 6 7 8 9 10 11 12 protected <T> List<BusinessItemData> itemMap2ItemList(Map< ...
- 打印从1到k之间的所有素数
问题分析:素数是指大于1且只能被它本身和1整除的数,根据定义可以从2开始对一个数取余数一直到它本身,若它有第三个整除数,则可以判定它不是素数.若使用这种方法,会浪费时间,我们可以判断2到这个数的算术平 ...
- Yii Framework 开发教程Zii组件-Tabs示例
有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...
- 《神经网络和深度学习》系列文章三:sigmoid神经元
出处: Michael Nielsen的<Neural Network and Deep Leraning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR硕士生 徐伟 ...
- java_method_日期方法
package cn.com.qmhd.tools; import java.text.SimpleDateFormat; import java.util.Calendar; import java ...
- jQuery之前端国际化jQuery.i18n.properties
jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化. 国际化英文单词为:Internationalization,又称i18n,"i& ...
- Java编程性能优化一
转自:http://my.oschina.net/xianggao/blog/77224 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...