iphone - 为 UIWebView 添加模型层(带缓存); UIWebViewNavigationType 和 shouldStartLoadWithRequest 的问题

标签 iphone caching uikit model uiwebview

我正在修改向 iPhone 应用程序添加模型层,以便我可以序列化/优先化 HTTP 请求并有选择地缓存响应。感谢 UIWebViewDelegate,以下方法使这变得相当简单(理论上):

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

基本上,我的代码检查 navigationType,将请求发送到模型,然后返回 NO。反过来,模型层处理请求,并在完成后将数据填充回 UIWebView,使用:

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL

不幸的是,当将数据推回 UIWebView 时,我经常看到 shouldStartLoadWithRequest 再次被触发(这次的 navigationType 为 5,但使用与原始请求相同的 URL)。我不能依赖模型从缓存中提供此服务(因为 URL 与之前相同),因此我必须让 UIWebView 通过返回 YES 来自行处理它。

我想避免这种情况,以便模型(和缓存层)查看并处理所有请求。有谁知道为什么我在辅助 shouldStartLoadWithRequest 中看到 navigationType 为 5?

最佳答案

我使用与您所追求的完全相同的策略实现了一个应用程序,并且我也遇到了同样的问题。

您看到的导航类型是 UIWebViewNavigationTypeOther。在我的应用程序中,我在初始请求和调用 loadData:MIMEType:textEncodingName:baseURL 产生的请求上都看到了 navigationType。无法根据提供的参数来区分差异。

这个解决方案让我不寒而栗,但它是 100% 可靠的。在实践中,每隔一段时间 webView:ShouldStartLoadWithRequest:navigationType: 被调用时,都是由于我调用了 loadData:MIMEType:textEncodingName:baseURL ,所以我通过创建一个名为 loadCachedData 之类的 BOOL 标志来解决这个问题,并将其在 YES 和 YES 之间切换没有每次 webView:ShouldStartLoadWithRequest:navigationType: 被调用。如果标志是"is",我会让请求通过。否则,我会使用我的缓存。效果非常好。

关于iphone - 为 UIWebView 添加模型层(带缓存); UIWebViewNavigationType 和 shouldStartLoadWithRequest 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329847/

相关文章:

ios - Swift:使用编程大小的 UIView 制作垂直滚动提要

android - 如何为移动应用程序创建演示

iphone - 使用动态大小的 subview 调整 UIView 子类的大小

iphone - 切换 UITableViewCell 中图像的显示

objective-c - 免费桥梁

caching - 在构建之间使用 gitlab ci runner 时如何为 sbt 启用 .ivy2 缓存

android - 在 android 中 2 天后使 UIL 缓存图像过期

Angular Service Worker SwUpdate.available 未触发

ios - 如何在 iOS 应用程序中编辑 PDF 表单?

ios - 将 UITapGestureRecognizer 添加到 tableViewCell 上的 subview