使用webview加载页面的时候,最理想的情况是: 资源文件没有更新,就只加载缓存文件。如果有更新,则第一时间使用新的文件。
UIWebview中提供的缓存策略
NSURLRequestUseProtocolCachePolicy 缓存策略定义在 web 协议实现中,用于请求特定的URL。是默认的URL缓存策略。
NSURLRequestReloadIgnoringLocalCacheData 从服务端获取数据,忽略本地缓存
NSURLRequestReloadIgnoringLocalAndRemoteCacheData //源文件注释中写到没有实现
NSURLRequestReloadIgnoringCacheData 被NSURLRequestReloadIgnoringLocalCacheData替换了
NSURLRequestReturnCacheDataElseLoad 已经存在的缓存数据用于请求返回,不管它的过期日期和已经存在了多久。如果没有请求对应的缓存数据,从数据源读取
NSURLRequestReturnCacheDataDontLoad 已经存在的缓存数据用于请求返回,不管它的过期日期和已经存在了多久。如果没有请求对应的缓存数据,不要去数据源读取,该请求被设置为失败,这种情况多用于离线模式
NSURLRequestReloadRevalidatingCacheData //源文件中写到没有实现
其中NSURLRequestUseProtocolCachePolicy的缓存策略如下所示:
存在的问题
不管使用哪种缓存策略,在使用过程中可能都会出现以下问题:
1.访问a页面;
2.跳转到b页面;
3.在b页面操作一些东西后;
4.回到a页面,此时a页面应当有变化;
但是实际过程中,第4步a页面并没有变化,和第1步访问结果显示一样,在app重新启动后,再次访问a页面时,发现才会有变化。
这是因为iOS中NSURLCache缓存引起的,NSURLCache缓存会根据url进行自动缓存,如果两次访问a页面的url相同,时间间隔比较短的时候就会出现以上问题。在app关闭后NSURLCache缓存也会被删除,所以再次打开app后a页面正确显示。
如何解决
在UIWebView页面切换成功后调用删除cache方法。
//清除webView的缓存
[[NSURLCache sharedURLCache] removeAllCachedResponses];