2009-08-25 37 views
3

我正在修改將模型層添加到iPhone應用程序,以便可以序列化/優先化HTTP請求並有選擇地緩存響應。由於UIWebViewDelegate,下面的方法讓這個相當簡單的(理論上):爲UIWebViews添加模型圖層(使用緩存); UIWebViewNavigationType和shouldStartLoadWithRequest問題

- (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的導航類型?

回答

4

我實現了一個應用程序使用完全相同的策略,你正在追求,我與相同的問題摔跤。

您所看到的navigationType是UIWebViewNavigationTypeOther。在我的應用程序中,我在初始請求以及由我對loadData:MIMEType:textEncodingName:baseURL的調用導致的請求上都看到了navigationType。沒有辦法根據提供的參數來區分差異。

該解決方案給了我震驚,但它是100%可靠的。實際上,每隔一段時間,webView:ShouldStartLoadWithRequest:navigationType:被調用,這是由於我對loadData:MIMEType:textEncodingName:baseURL的調用,所以我通過創建一個名爲loadingCachedData的BOOL標誌來解決此問題,並在YES和每次都沒有webView:ShouldStartLoadWithRequest:navigationType:被調用。如果該標誌是YES,我會讓請求通過。否則,我會進入我的緩存。像魅力一樣工作。

+1

是的,這是純粹的邪惡,但我真的沒有看到許多其他選擇,最後,我做了同樣的事情。謝謝! –

+0

你應該接受這個答案,然後! :) –