iOS 关于网络请求缓存策略cachePolicy配置

         之前有因为cachePolicy配置不当,导致的出现一些bug,查找资料解决了,并没有进行记录,最近想了起来,写篇文章记录一下,方便自己以后查看

由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)

因此一般只对GET请求进行缓存,而不对POST请求进行缓存,我也只针对get请求进行了设置

在iOS中,可以使用NSURLCache类缓存数据

要想对某个GET请求进行数据缓存

  • 常用缓存策略

NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)

NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现

NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求

NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)

NSURLRequestReloadRevalidatingCacheData // 未实现

  • 下面有三种方法配置request的缓存策略,而且生效优先级依次降低

(1)设置单个请求的缓存策略,直接设置单个请求的缓存策略,其生效的优先级是最高的

      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 设置缓存策略

    request.cachePolicy = NSURLRequestUseProtocolCachePolicy;

(2)设置NSURLSession缓存策略,使用该session发出的所有请求都会服从该session的缓存策略,生效优先级低于上面

        NSURLSessionConfiguration *confi = [NSURLSessionConfiguration defaultSessionConfiguration];

        confi.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;

        NSURLSession *session = [NSURLSession sessionWithConfiguration:confi delegate:self

                                                 delegateQueue:[NSOperationQueue mainQueue]];

(3)AFNetworking缓存策略,生效优先级低于上面的NSURLSession缓存配置

       AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

       manager.requestSerializer.cachePolicy = NSURLRequestUseProtocolCachePolicy;

  • 下面有针对NSURLRequestUseProtocolCachePolicy这个配置进行详细说明,对于缓存的响应过期或者需要重新验证的情况,可以通过HTTP中请求和响应头来判断
  • Cache-Control
    在第一次请求到服务器资源的时候,服务器需要使用Cache-Control这个响应头来指定缓存策略,它的格式如下:Cache-Control:max-age=xxxx,这个头指指明缓存过期的时间
    Cache-Control头具有如下选项:
常量意义
public指示响应可被任何缓存区缓存
private内容只缓存到私有缓存中(仅客户端可以缓存)
no-cache指示请求或响应消息不能缓存
no-store所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation如果缓存的内容失效,请求必须发送到服务器进行重新验证
max-age可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh可以接收响应时间小于当前时间加上指定时间的响应
max-stale可以接收超出超时期间的响应消息
  • Expires
    Expires表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
    格式:Expires = "Expires" ":" HTTP-date"
    例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT (必须是GMT格式)

  • Last-Modified/If-Modified-Since
    Last-Modified是由服务器返回响应头,标识资源的最后修改时间.
    If-Modified-Since 则由客户端发送,标识客户端所记录的,资源的最后修改时间。服务器接收到带有该请求头的请求时,会使用该时间与资源的最后修改时间进行对比,如果发现资源未被修改过,则直接返回HTTP 304而不返回包体,告诉客户端直接使用本地的缓存。否则响应完整的消息内容。

  • Etag/If-None-Match
    Etag 由服务器发送,告之当资源在服务器上的一个唯一标识符。
    客户端请求时,如果发现资源过期(使用Cache-Control的max-age),发现资源具有Etag声明,这时请求服务器时则带上If-None-Match头,服务器收到后则与资源的标识进行对比,决定返回200或者304。

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值