IOS网络请求之NSURLSession使用详解

2020-01-18 20:51:03王旭

前言:

无论是Android还是ios/212192.html">ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPRequest已经停止维护,大家都在用AFNetWorking作为首选网络请求框架,之前的ASIHTTPRequest是基于NSURLConnection类实现的,早期的AFNetWorking也是基于NSURLConnection实现,后来iOS9 之后已经放弃了NSURLConnection,开始使用iOS 7之后推出的NSURLSession,本着追根溯源的原则,首先学习一下NSURLSession的实现网络请求,然后再去学习AFNetWorking。

了解NSURLSession

NSURLSession是2013年iOS 7发布的用于替代NSURLConnection的,iOS 9之后NSURLConnection彻底推出历史舞台。其使用起来非常方便,今天使用NSURLConnection分别实现了get、post、表单提交、文件上传、文件下载,让我这个以Android开发为主的屌丝程序员赞叹不已,根据NSURLSession会话对象创建一个请求Task,然后执行该Task即可,包括缓存、会话周期,多线程任务iOS都已经在sdk层面封装完毕,不过比较遗憾的时NSURLSession只提供了异步请求方式而没有提供同步请求方式。接下来我们来如何实现网络请求。

NSURLSession使用

我们首先以一个简单的get请求为例开始。

1.)首先构造一个NSURL请求资源地址


  // 构造URL资源地址
  NSURL *url = [NSURL URLWithString:@http://www.easck.com/method?name=yanzhenjie&pwd=123];

2.)创建一个NSRequest请求对象


  // 创建Request请求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 配置Request请求
  // 设置请求方法
  [request setHTTPMethod:@"GET"];
  // 设置请求超时 默认超时时间60s
  [request setTimeoutInterval:10.0];
  // 设置头部参数
  [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
  //或者下面这种方式 添加所有请求头信息
  request.allHTTPHeaderFields=@{@"Content-Encoding":@"gzip"};
  //设置缓存策略
  [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

根据需求添加不用的设置,比如请求方式、超时时间、请求头信息,这里重点介绍下缓存策略:

NSURLRequestUseProtocolCachePolicy = 0 //默认的缓存策略, 如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断下一步操作,如: Cache-Control字段为must-revalidata, 则询问服务端该数据是否有更新,无更新的话直接返回给用户缓存数据,若已更新,则请求服务端. NSURLRequestReloadIgnoringLocalCacheData = 1 //忽略本地缓存数据,直接请求服务端. NSURLRequestIgnoringLocalAndRemoteCacheData = 4 //忽略本地缓存,代理服务器以及其他中介,直接请求源服务端. NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData NSURLRequestReturnCacheDataElseLoad = 2 //有缓存就使用,不管其有效性(即忽略Cache-Control字段), 无则请求服务端.  NSURLRequestReturnCacheDataDontLoad = 3 //只加载本地缓存. 没有就失败. (确定当前无网络时使用) NSURLRequestReloadRevalidatingCacheData = 5 //缓存数据必须得得到服务端确认有效才使用