2012-04-13 64 views
7

我正在使用NSURLRequest來檢查可用的數據更新。今天我注意到,NSURLRequest默認緩存了請求。即使幾個小時後,也沒有新的請求發送到服務器。現在我想知道這個緩存的默認行爲是什麼。緩存的數據何時將陳舊,並且新的請求會發送到服務器? 的數據是一個靜態文件和服務器不發送明確的緩存控制標題:什麼是NSURLRequests的默認緩存過期時間?

HTTP/1.1 200 OK
Date: Fri, 13 Apr 2012 08:51:13 GMT
Server: Apache
Last-Modified: Thu, 12 Apr 2012 14:02:17 GMT
ETag: "2852a-64-4bd7bcdba2c40"
Accept-Ranges: bytes
Content-Length: 100
Vary: Accept-Encoding,User-Agent
Content-Type: text/plain

PS:我的應用程序的新版本設置明確的緩存策略,所以這不是一個問題了,但我很好奇默認行爲是什麼。

回答

0

它用於在重新啓動我的應用程序後執行新的請求。通過重新啓動,我可以通過按主頁按鈕兩次來顯示正在運行的應用程序列表,然後殺死我的應用程序,然後通過單擊應用程序圖標再次重新開始。

也可以禁用緩存,如果你想。重寫NSURLProtocol委託的這種方法

//禁用緩存,因爲我們的文件存儲在多個服務器中,並且錯誤響應緩存可能導致問題。

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection 
       willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSCachedURLResponse *newCachedResponse = cachedResponse; 

    //if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) 
    { 
     newCachedResponse = nil; 
    } 
    return newCachedResponse; 
} 
+0

我知道如何解決這個問題。我提到過,我在我的應用程序的新版本中設置了一個明確的緩存策略。所以,實際的問題就解決了。我只是對默認行爲感到好奇。 – henrik 2012-04-13 10:38:19

+0

很酷..我的答案也是一個FYI :) – Naresh 2012-04-13 10:39:30

+0

我剛剛回答我的回調,如果我看我的日誌applicationWIllTerminate被調用,每當我從多任務列表中刪除,這就是爲什麼我相信它爲應用程序開發人員這是你需要處理應用程序退出代碼。我想表明,一旦應用程序在這個 – Naresh 2012-04-16 13:14:30

13

注:here規定應如何詳細

  1. 工作如果有則沒有高速緩存獲取數據。

  2. 如果有高速緩存,然後檢查加載方案

    一個。如果指定了重新驗證,請檢查源的更改

    b。如果沒有指定重新驗證,則按照3)從本地高速緩存中獲取,如3)

  3. 如果未指定重新驗證,則檢查本地高速緩存是否足夠新。

    a。如果高速緩存未陳舊,則它從高速緩存中提取數據。

    b。如果數據是陳舊然後重新驗證來自源

here

一個的NSURLRequest例如默認的緩存策略NSURLRequestUseProtocolCachePolicy。所述NSURLRequestUseProtocolCachePolicy行爲是特定的協議,並且被定義爲用於協議

here最好貼合策略:

如果NSCachedURLResponse不會爲請求存在,則該數據是從 取出原始來源。如果請求存在緩存的響應,則加載 的URL會檢查響應,以確定它是否指定重新驗證內容必須是 。如果必須重新驗證內容,則與原始源 進行連接以查看它是否已更改。如果它沒有改變,那麼響應從本地緩存返回 。如果它發生了變化,則從原始源獲取數據。

如果緩存的響應未指定內容必須重新生效,則會檢查響應中指定的最大年齡或到期日期。如果緩存的響應是最近的 ,那麼響應將從本地緩存中返回。如果確定響應 陳舊,則檢查始發源以獲取更新的數據。如果更新的數據是 可用,則從源發送源獲取數據,否則從緩存中返回 。

列出的其他選項here

+1

後新鮮啓動緩存得到刷新感謝您的答案。我已閱讀文檔。它指出,「行爲是特定於協議的」。現在,如果現在顯式的過期時間是由服務器設置的,並且客戶端沒有配置特定的行爲,那麼NSUrlRequest會在哪個時間從緩存中驅逐項目? – henrik 2012-04-16 12:59:20

+0

@henrik回答更詳細的信息 – mydogisbox 2012-04-16 13:12:51

+0

據我所知,NSUrlCache沒有時間限制。時間限制由請求協議設置。如果該協議沒有指定一個,那麼可能沒有一個。 – mydogisbox 2012-04-16 13:56:03

0

根據這篇文章:http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html,如果您使用的是NSURLRequestUseProtocolCachePolicy,並且服務器未返回過期或最大年齡,則默認緩存時間間隔爲6-24小時。所以要小心這種情況。使用NSURLRequestUseProtocolCachePolicy時,最好設置max-age或expiration。

+0

目前使用NSURLRequestUseProtocolCachePolicy不會自動錶示將緩存某些內容,我剛纔嘗試了一下。 – David 2017-02-09 15:11:53

相關問題