2009-08-25 10 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は以前と同じです)ので、YESを返すことでUIWebView自体を処理させる必要があります。

モデル(およびキャッシングレイヤー)がすべての要求を参照して処理するようにしたいと思います。私は2番目のshouldStartLoadWithRequestでnavigationType5を見ている理由は誰にもありますか?

答えて

4

私はあなたが追求しているのと全く同じ戦略を使ってアプリケーションを実装しましたが、私は同じ問題に取り組んでいました。

表示されているナビゲーションタイプは、UIWebViewNavigationTypeOtherです。私のアプリケーションでは、私の最初のリクエストと、loadData:MIMEType:textEncodingName:baseURLへの呼び出しの結果のリクエストの両方でnavigationTypeを確認していました。提供されたパラメータに基づいて違いを知らせる方法はありませんでした。

解決策は私に震えを与えましたが、100%信頼性がありました。実際には、たびにwebView:ShouldStartLoadWithRequest:navigationType:loadTypeが呼び出されました。これはloadData:MIMEType:textEncodingName:baseURLの呼び出しによるものです。このため、loadingCachedDataのようなBOOLフラグを作成し、YESと毎回いいえwebView:ShouldStartLoadWithRequest:navigationType:呼び出されました。フラグがYESの場合は、リクエストを通過させます。それ以外の場合は、私のキャッシュに浸ります。魅力のように働いた。

+1

ええ、それは純粋な邪悪ですが、私は実際には他の多くの選択肢が見当たらず、結局同じことをしました。ありがとう! –

+0

これを答えとして受け入れる必要があります。 :) –

関連する問題