之前有因为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。