2011-08-10 14 views
0

私はASIHTTPRequestを使ってインターネットからデータをダウンロードしています。それはあなたがダウンロードされたデータをキャッシュするようにオンにすることができるきれいなキャッシュ機能を持っています。ここまでは順調ですね。しかし、私のウェブサーバに新しいデータをアップロードして再びダウンロードしようとすると、ではなく、はデータが新しく変更されているのでキャッシュを使用することを期待しています。しかしそれでもなおはまだキャッシュを使用します。Objective-C - 新しいコンテンツが利用可能な場合でもASIHTTPRequestキャッシュ

私は私の要求のために次のコードを使用しています:HTTPScoop異なるヘッダを表示するために

2枚の画像:

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]]; 

// When you turn shouldRespectCacheControlHeaders off, the cache will store responses even if the server 
// has explictly asked for them not be be cached (eg with a cache-control or pragma: no-cache header) 
[[ASIDownloadCache sharedCache] setShouldRespectCacheControlHeaders:NO]; 

NSURL *officesUrl = [NSURL URLWithString:@"http://www.example.com/example.json"]; 
ASIHTTPRequest *officesRequest = [ASIHTTPRequest requestWithURL:officesUrl]; 

[officesRequest setDefaultResponseEncoding:NSUTF8StringEncoding]; 

[officesRequest addRequestHeader:@"Cache-Control" value:@"no-cache"]; 

// Always ask the server if there is new content available, 
// If the request fails, use data from the cache even if it should have expired. 
[officesRequest setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; 

[officesRequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 

[officesRequest setDelegate:self]; 

[officesRequest startAsynchronous]; 

EDITを。最初の画像は、キャッシュされたコンテンツのない新鮮なダウンロードです。 2番目の画像私は新しいデータと変更されたデータをアップロードしました。

まず:

enter image description here

第二:

enter image description here

EDIT2:追加のログ

https://gist.github.com/1139351

+0

おそらく、ASIHTTPRequestはETagを使ってコンテンツが変更されたかどうかを判断し、サーバーはコンテンツの変更時にETagを変更しないでしょうか?参照:http://en.wikipedia.org/wiki/HTTP_ETag –

+0

最初のフェッチ(空のキャッシュ)のためのhttpトレースと、charlesproxyのようなツールを使用して間違ってキャッシュするリクエストの別のトレースを収集し、あなたの質問。 – JosephH

+0

万が一、シミュレータを起動していますか?私は、シミュレータ自体がキャッシュを使用するかもしれないと思う。 ASIHTTPRequestのキャッシュポリシーを明示的に(ASIDoNotReadFromCacheCachePolicy | ASIDoNotWriteToCacheColicyPolicy)に設定していたにもかかわらず、シミュレータで実行中の問題が発生しましたが、古い結果が返されていました。しかし、この動作はデバイスでは発生しませんでした。 –

答えて

0

私はそれより多くのデバッグ出力を期待していました。

私はあなたが応答処理を踏むだけで、キャッシュされたバージョンが使用することが大丈夫だと判断した理由を理解する必要があると思います。コードはかなり簡単に従うことができます。

readResponseHeadersから呼び出された場合は特に、と canUseCachedDataForRequestで開始するASIHTTPRequest.mに useDataFromCacheにブレークポイントを設定してみてください。

+0

デバッグで何を探しているのでしょうか?ASIHTTPRequest正しくキャッシュしていますか? –

+0

useDataFromCacheにブレークポイントを設定する - あなたのケースで間違って呼び出している人は、ブレークポイントがヒットしたときにレベルを上げて、どの条件が満たされているかを見てuseDataFromCacheが呼び出されます。 – JosephH

関連する問題