探究WK缓存,可以从NSURLRequest
入手,通过其加载URL并设置缓存策略,
缓存策略
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
NSURLRequestUseProtocolCachePolicy = 0, // 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重新验证cache
NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存,直接从服务器请求数据
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // iOS 13 才实现,忽略本地缓存数据、代理和其他中介的缓存,直接从从服务器请求数据
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
NSURLRequestReturnCacheDataElseLoad = 2, // 优先从本地拿数据,且忽略请求生命时长和过期时间。但是如果没有本地cache,则从服务器请求数据
NSURLRequestReturnCacheDataDontLoad = 3, // 只从本地拿数据
NSURLRequestReloadRevalidatingCacheData = 5, // iOS 13才实现,从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从服务器请求数据
};
NSURLRequestUseProtocolCachePolicy
分析默认缓存流程
- 缓存不存在,则直接从服务器获取数据
- 缓存存在,从响应
response
头信息获取【是否每次必须进行资源更新,且缓存状态是够更新等条件】必须更新 - 缓存过期或者每次必须校验资源更新,会进行一个资源更新请求,有更新使用服务器返回新数据,没有更新用本地数据
解析HTTP协议缓存
客户端默认缓存实际由服务器控制,客户端和服务器通过http请求头和响应头的缓存字段控制,进而影响客户端的行为
-
Cache-Control:max-age=xxx
第一次请求服务器资源的时候,服务器需要使用Cache-Control响应头指定缓存过期时间 -
Last-Modified/if-Modifired-Since
Last-Modified:由服务器返回响应头,标识资源修最后的修改时间
if-Modifired-Since:客户端发送,表示客户端记录,资源最后的修改时间,服务器收到带有该请求头的请求时,会使用该时间与资源的最后修改时间进行对比,如果发现资源未被修改,则直接返回304,告诉客户端使用本地缓存,否则响应完整的消息内容 -
Etag/if-None-Match
Etag由服务器发送,告知资源在服务器的一个标识。
客户端请求时,如果发现资源过期(用Cache-Control判断),发现资源带有Etag标识,这时请求服务器带上if-none-match头,服务器收到之后与资源表示进行对比,决定返回304或者200
网友评论