iOS缓存策略

  碰见的问题是,客服反馈有一些图片没有及时更新导致自己没有抢到优惠,才注意到webview缓存相关的一些知识。后台配合做了一些修改,通过控制cache-control实现对不同的资源进行不同的缓存策略。现在做一下总结。

 

1.NSURLRequestUseProtocolCachePolicy

如果缓存数据不存在则直接从源端加载数据

否则如果缓存响应中没有明确表示每次请求必须重新验证则如果不是缓存过期则会返回缓存数据

如果缓存过期或需要重新验证URL加载系统发送HEAD请求到源端查看资源是否发生了变化如果变化了则取出从始发源的数据否则返回缓存

 

缓存过期或者需要重新验证说明

对于过期或者需要重新验证说明的情况可以通过HTTP中请求头和响应头判断

Cache-Control

第一次请求到资源时服务器需要使用cache-Control这个响应头来指定缓存策略格式如下Cache-Controlmax-age=xxx指明缓存过期时间

常量

意义

public

指示响应可被任何缓存区缓存

private

内容只缓存到私有缓存中(仅客户端可以缓存)

no-cache

必须和服务器端确认响应是否发生变化,如果没有就是用缓存,否则更新请求响应数据

no-store

所有内容都不会被缓存到缓存或 Internet 临时文件中

must-revalidation

如果缓存的内容失效,请求必须发送到服务器进行重新验证

max-age

可以接收生存期不大于指定时间(以秒为单位)的响应

min-fresh

可以接收响应时间小于当前时间加上指定时间的响应

max-stale

可以接收超出超时期间的响应消息

  

其他头信息

Last-Modified请求资源最近修改时间

Etags请求资源标识符用于动态生成没有Last-Modified的资源

Vary决定请求是否可以缓存

 

总结

默认缓存策略当客户端发起请求时先检查本地是否缓存如果有再检查缓存是否过期通过Cache-Control判断),没有过期直接使用缓存策略如果过期就发起请求给服务器如果资源具有Last-Modified或者Etages声明服务器就会对比资源Last-ModifiedEtages如果不同则返回新数据否则返回304或者200告诉客户端使用本地缓存304表示资源未更新这个过程中客户端发送请求主要取决于max-age是否过期过期后就重新发送请求服务端根据情况通知客户端是否可以继续使用缓存 

 

2.NSURLRueuestReloadIgnoringLocalCacheData

设置默认忽略缓存

但是其效果并不会完全忽略

 

使用下方法清除缓存可从侧面解决该问题

NSSet *webSite = [WKWebsiteDataStore allwebsiteDataTypes];

NSDate *dateFrom = [NSDate datewithTimeIntervalSince1970:0];

[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:webSite modifiedSince:datefrom completionHandler:^{}];

 

posted @ 2022-08-04 16:05  强天  阅读(177)  评论(0编辑  收藏  举报