2012-02-12 78 views
0

我正在使用ASIHTTPRequest API從Web端獲取一些JSON數據。我正在使用異步請求而不更改默認緩存屬性。代碼如下:ASIHTTPRequest似乎總是緩存JSON數據

__unsafe_unretained ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url]; 

request.timeOutSeconds = 30; 
[request setCompletionBlock:^(void) 
{ 
    NSString *str = [request responseString]; 
    /* 
    * 
    * 
    */ 
}]; 
[request setFailedBlock:^(void) 
{ 
    NSLog(@"status: %@",[request responseStatusMessage]); 
    NSLog(@"%@ : %@",[request url],[[request error] debugDescription]);   
}]; 
[request startAsynchronous]; 

但是,雖然服務器中JSON數據的內容發生了變化,但獲得的JSON數據仍保留舊數據。

我使用網絡瀏覽器在筆記本電腦和iPhone safari上檢查了數據。當我在JSON更改後請求url時,它首先返回舊數據,但是如果我刷新頁面,它將返回更新的數據。但在應用程序中,ASIHTTPRequest始終返回舊數據。

我也嘗試調試ASIHTTPRequest代碼,以查看是否使用了任何緩存的數據。但它似乎從來沒有使用下載緩存,因爲它尚未設置。它永遠不會輸入[useDataFromCache]方法。

可能是什麼問題?我如何強制ASIHTTPRequest檢查服務器上是否有更新的數據,並使其獲得真正更新的JSON?

編輯

我用Cache-Control頭,現在我得到正確的更新JSON數據。代碼如下:

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

不過,我認爲從現在開始,請求將始終嘗試檢索JSON,即使它不被修改,這會降低性能。

我該如何讓它首先檢查服務器是否修改了數據,並檢索它是否被修改?目前我得到的JSON數據是一個來自php url的動態響應,所以沒有文件可以檢查數據的最新性。

什麼是解決方案?

問候,

回答

1

鑑於你所說的一切,ASIHTTPRequest似乎不太可能緩存響應。

所以,其他的東西一定是 - 你似乎在你和服務器之間有一個緩存代理服務器,這就是爲什麼設置Cache-Control有所作爲的原因。

它可能是您本地網絡上的代理服務器,或者它可能位於您的ISP,或者它可能位於您正在使用的Web服務器的前面。

+0

嗯,我的網絡有一個代理服務器。 但據我記得,我也試圖在公共網絡中使用該應用程序,該應用程序又返回了舊數據。 但我仍然無法弄清楚如何在檢查數據最近的情況下執行緩存策略。如果我在服務器端的響應頭中提供Cache-Control頭,它也可以工作嗎?如果是,使用'(ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy)'數據緩存策略可能會工作? – manuyavuz 2012-02-12 21:44:00

+0

感謝您的建議,我們意識到服務器端實際上是緩存響應,現在它的工作沒有問題。 – manuyavuz 2012-02-20 11:37:55

0

根據ASIHTTPRequest的文檔,調用方法

[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 

將清除緩存。在發送請求之前調用此方法,它應該爲您提供更新的JSON數據。

+0

我試過了(還添加了刪除會話緩存)。 '[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICacheForSessionDurationCacheStoragePolicy]; __unsafe_unretained ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];' 但它沒有奏效。我認爲它不應該關於ASIHTTP緩存,因爲它根據文檔默認情況下不使用緩存。但我找不到這種奇怪行爲的其他原因。 – manuyavuz 2012-02-12 20:16:07