为UIWebViews添加模型层(带缓存);使用UIWebViewNavigationType和shouldStartLoadWithRequest时出现问题

时间:2009-08-25 17:48:50

标签: 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(这次导航类型为5,但使用与原始请求相同的URL)。我不能依赖模型从缓存中提供这个(因为URL与之前的相同),所以我必须让UIWebView通过返回YES来处理它。

我想避免这种情况,以便模型(和缓存层)查看并处理所有请求。有没有人有任何想法为什么我在辅助的shouldStartLoadWithRequest中看到导航类型为5?

1 个答案:

答案 0 :(得分:4)

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

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

解决方案给了我一些颤抖,但它是100%可靠的。在实践中,每隔一次webView:ShouldStartLoadWithRequest:navigationType:被调用,这是由于我调用loadData:MIMEType:textEncodingName:baseURL,所以我通过创建一个名为loadingCachedData的BOOL标志来解决这个问题,并在YES和之间切换它。每次webView:ShouldStartLoadWithRequest:navigationType:被调用时都没有。如果标志为YES,我会通过请求。否则,我会进入我的缓存。工作就像一个魅力。