我正在修补向 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 与之前相同),所以我必须通过返回 YES 来让 UIWebView 自己处理它。
我想避免这种情况,以便模型(和缓存层)看到并处理所有请求。有没有人知道为什么我在次要的 shouldStartLoadWithRequest 中看到 navigationType 为 5?
最佳答案
我使用您所追求的完全相同的策略实现了一个应用程序,并且我遇到了同样的问题。
您看到的 navigationType 是 UIWebViewNavigationTypeOther。在我的应用程序中,我在初始请求和调用 loadData:MIMEType:textEncodingName:baseURL 所产生的请求中都看到了 navigationType。无法根据提供的参数区分差异。
该解决方案让我不寒而栗,但它是 100% 可靠的。在实践中,每隔一次 webView:ShouldStartLoadWithRequest:navigationType: 被调用,这是由于我调用了 loadData:MIMEType:textEncodingName:baseURL,所以我通过创建一个名为 loadingCachedData 之类的 BOOL 标志来解决这个问题,并在 YES 和没有每次 webView:ShouldStartLoadWithRequest:navigationType: 被调用。如果标志是 YES,我会让请求通过。否则,我会进入我的缓存。像魅力一样工作。
关于iphone - 为 UIWebViews 添加模型层(带缓存); UIWebViewNavigationType 和 shouldStartLoadWithRequest 的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1329847/