2010-02-25 77 views
3

我正在寫一個iPhone應用程序,它的一個選項卡是一個Twitter供稿,我正在解析twitter xml並將其很好地放在表視圖中。 如果沒有互聯網連接,我想顯示最後一次互聯網連接和表更新的緩存結果。 我使用NSURLCache對於像這樣:NSURLCache高速緩存響應問題

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink] 
     cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60]; 
NSURLCache *sharedCache = [NSURLCache sharedURLCache]; 

NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest]; 

if (response) { 
    NSLog(@"Got Response"); 
} else { 
    NSLog(@"Didn't got Response"); 
} 
self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease]; 

我可以看到,對於第一次的NSLog輸出「沒有得到迴應」,因爲它是第一次訪問這個網站 我可以(http://www.twitter.com/..。)還看到,響應被緩存,因爲我實現了initWithRequest推出之後被調用,像這樣的willCacheResponse方法:

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection 
    willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSLog(@"willCache Reponse"); 
    NSCachedURLResponse *newCachedResponse = nil;  
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) { 
      newCachedResponse = [[[NSCachedURLResponse alloc] 
      initWithResponse:[cachedResponse response] 
      data:[cachedResponse data] 
      userInfo:nil 
      storagePolicy:[cachedResponse storagePolicy]] 
      autorelease]; 
} 
    return newCachedResponse; 
} 

我第二次訪問這個網站,我可以清楚地看到的NSLog輸出「得到的迴應「這意味着有一個緩存命中,因此willCacheResponse s應該再次調用而不是,但出於某種奇怪的原因,它被一次又一次地調用,並且不會將信息從緩存中取出,而是嘗試再次緩存它。

任何想法是什麼導致此問題?

謝謝!

+0

我嘗試了所有類型的政策。 基本上我需要使用NSURLRequestUseProtocolCachePolicy,總是從遠程加載如果有互聯網連接,否則從緩存中加載,但兩者都給我同樣的問題。 – djTeller 2010-02-25 23:17:59

回答

0

如果我正確理解你的問題,然後我有同樣的問題,從來沒有解決它: Does NSURLConnection take advantage of NSURLCache?

據我所知,NSURLConnection的只是不走高速緩存的優勢,你必須如果你想要的話,自己動手吧。

+0

這正是我的問題,好像它只緩存響應URL而不是它的數據,所以萬一我想使用它,我可以驗證我已經訪問了一個特定的網站。 我實際上昨天整天使用NSKeyedArchive實現緩存,我在開始時使用NSURLCache,只是作爲緩存該網站的指示,如果響應是否,我緩存它,如果響應是肯定的,我將它從檔案。 他們應該使這個主題的文檔更清晰一些,並且還要添加一些例子。 – djTeller 2010-02-27 14:12:52

2

OP可能不在乎任何東西,但對於其他人玩這個 - 你應該看看在響應中返回的HTTP頭。 NSURLCache將檢查標題以決定它是否可以使用從緩存中返回的東西。的Cache-Control:上次修改:Etag的:等