2014-01-09 57 views
4

我想從NSURLCache中獲取以前緩存的信息。使用此代碼:NSURLCache cachedResponseForRequest不檢索緩存的數據

NSString *theCompleteURL = @"http://192.168.1.2:8080/api/endpoint.json"; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:theCompleteURL]]; 

NSCachedURLResponse *response = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; 
if (response) { 
    NSLog(@"Cached data found"); 
} 
else { 
    NSLog(@"Cached data not found"); 
} 

但我始終得到零作爲響應爲來自方法cachedResponseForRequest的「響應」變量。

我相信有關的數據緩存裏面,因爲我在我的應用程序的Cache.db文件檢查的話,從cfurl_cache_response表得到這樣的結果:

sqlite> select * from cfurl_cache_response; 
1|0|1875686237|0|http://192.168.1.2:8080/api/endpoint.json|2014-01-09 11:55:17| 
sqlite> 

在ApplicationDelegate的NSURLCache配置作爲:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:5 * 1024 * 1024 
                diskCapacity:40 * 1024 * 1024 
                 diskPath:nil]; 

[NSURLCache setSharedURLCache:cache]; 

任何關於什麼可以與緩存進行的想法嗎?

我的端點的標題是這樣的:

$ curl -I http://192.168.1.2:8080/api/endpoint.json 
HTTP/1.1 200 OK 
Content-Length: 1385 
Expires: Thu, 01 Dec 2020 16 
00: 00 GMT 
Content-Type: application/json;charset=utf-8 
ETag: "3e86-410-3596fbbc" 
Cache-Control: max-age=3600 
Connection: keep-alive 
Server: thin 1.5.1 codename Straight Razor 
$ 
+0

請發表回覆標題。請發佈數據應放在緩存中的代碼 – danh

+0

編輯添加標題 –

+1

你能解決這個問題嗎? – estemendoza

回答

1

這可以通過與響應相關的報頭,特別是Cache-controlEtag領域來解釋。也here參見:

13.1.3緩存控制機制

在HTTP基本高速緩存機制/ 1.1(服務器指定的到期時間和驗證器)對高速緩存的隱式指示。在某些情況下,服務器或客戶端可能需要向HTTP緩存提供明確的指令。爲此,我們使用Cache-Control標頭。

Cache-Control頭允許客戶端或服務器在請求或響應中傳輸各種指令。這些指令通常會覆蓋默認的緩存算法。作爲一般規則,如果標題值之間有明顯衝突,則應用最嚴格的解釋(即最有可能保留語義透明度的解釋)。

13.3.2實體標籤高速緩存校驗器

的ETag的響應報頭字段值,實體標籤,提供了一種「不透明」緩存驗證。這可能允許在存儲修改日期不方便的情況下進行更可靠的驗證,其中HTTP日期值的一秒分辨率不足,或者原始服務器希望避免使用修改日期可能引起的某些悖論。

您可以找到here緩存控制的允許值和here對於Etag的允許值。

+0

我將我的標題添加到原始問題。閱讀這些鏈接後,他們顯然是正確的。我正在使用Etag和max-age = 3600,同時嘗試使用Cache-control等於max-age = 3600,公共結果完全相同。 –