2014-04-28 55 views
1

我對理解iOS中的緩存機制有點困惑。NSURLCacheStoragePolicy請求與響應

我一直在閱讀這個博客NSURLCache來定製我的緩存策略。 我希望我的緩存完全由我的服務器緩存頭控制。

所以我設置

[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; 

現在上面的博客指定我還可以指定NSCachedURLResponse緩存策略。

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection 
        willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
    NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; 
    NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryOnly; 

    // ... 

    return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] 
                data:mutableData 
               userInfo:mutableUserInfo 
              storagePolicy:storagePolicy]; 
} 

那麼,首先有什麼使用緩存策略的請求? 存儲策略是請求參數還是響應參數。

回答

3

這裏的區別是:
NSURLRequestCachePolicy是客戶端 - 服務器的數據管理功能,描述應加載數據的來源(本地緩存遠程服務器)以及它們之間的條件。

NSURLCacheStoragePolicy只是客戶端數據管理功能,它描述的是本地緩存(內存,本地數據庫等;僅限內存;無)的本地緩存的存儲。

例如,如果您使用NSURLRequestReturnCacheDataElseLoad請求和NSURLCacheStorageAllowedInMemoryOnly的響應,那麼這樣的情況發生:

  1. 您發起請求;
  2. NSURLConnection在首次請求時從服務器加載數據,並且沒有任何緩存;
  3. 當收到響應它保存到基於內存(當啓動應用程序時,將只活緩存存儲;
  4. 您發起更多的時間相同的請求;
  5. NSURLConnection的負載從本地緩存中存儲的數據;
  6. 您關閉應用程序(緩存存儲被釋放),再次啓動它,併發起了同樣的要求;從服務器緩存中存儲基於內存被釋放
  7. NSURLConnection的負載數據
+0

這是否意味着熱曲est緩存策略作爲HTTP請求頭髮送,以便服務器可以在其末尾決定緩存策略? NSURLRequestCachePolicy如何影響客戶端呢? –

+0

@KunalBalani,不,NSURLRequestCachePolicy的值不會發送到服務器。它用於決定如何加載數據:從遠程服務器或本地緩存。服務器可以爲緩存提供任何附加信息(例如,數據可以從緩存中加載的時間段。例如,如果服務器設置header:cache-control:600,則意味着在接下來的10分鐘(600秒)會從緩存中加載數據。 –