iOS開發ASIHTTPRequest使用download cache

來源:互聯網
上載者:User

本文為大家介紹了iOS開發ASIHTTPRequest使用download cache的內容,其中包括cache策略,儲存策略,其他cache相關的特性,編寫自己的cache等等內容。

從1.8版本開始,ASIDownloadCache和ASICacheDelegate的API改變了,你可能需要修改你的代碼。

尤其是,cache策略的可用選項發生了改變,你現在可以對單一request使用結合的cache策略

ASIHTTPRequest可以自動緩衝下載的資料,在很多情況下這很有用。

  • 當你離線時,你無法再次下載資料,而你又需要訪問這些資料
  • 從上次下載這些資料後,你只想在資料更新後才下載新的資料
  • 你處理的資料永遠不會發生改變,所以你只想下載一次資料

在之前版本的ASIHTTPRequest裡,遇到上述情況,你只能自己處理這些策略。在一些情況下,使用download cache可以讓你不用再寫本機快取機制。

ASIDownloadCache 是個簡單的URL cache,可以用來緩衝GET請求的相應資料。一個request要被緩衝,它首先必須請求成功沒有發送錯誤),伺服器必須返回200HTTP狀態值。或者,從1.8.1版本開始,301,302,303,307重新導向狀態代碼都可以。

要開啟響應值的cache機制很簡單:

 
  1. [ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]]; 

這樣做以後,所有的request都會自動使用cache。如果你願意,你可以讓不同的request使用共用的cache:

 
  1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  2. [request setDownloadCache:[ASIDownloadCache sharedCache]]; 

你不會被局限於使用單一的cache,你可以想建立多少cache就建立多少cache,只要你喜歡 ^ ^。當你自己建立一個cache,你必須設定cache的路徑——這路徑必須是一個你擁有寫入權限的目錄。

 
  1. ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease]; 
  2. [cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"]; 
  3.  
  4. //別忘了 - 你必須自己retaining你自己的cache! 
  5. [self setMyCache:cache]; 
  6.  
  7. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  8. [request setDownloadCache:[self myCache]]; 
cache策略

cache策略是你控制cache中資訊的主要方法,控制何時使用cache資料而非重新下載資料。

每個request的cache策略可是由request的cachePolicy 屬性來控制的。cache策略使用掩碼來定義,所以你可以二進位“與”操作他們。

 
  1. // 每次都向伺服器詢問是否有新的內容可用, 
  2. // 如果請求失敗, 使用cache的資料,即使這個資料已經到期了 
  3. [request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; 

你可以使用下列cache策略選項來控制request的緩衝策略:

ASIUseDefaultCachePolicy

預設的cache 策略。請勿將這一項與其他項結合使用。當你設定一個request使用cache,它會使用cache的defaultCachePolicy. ASIDownloadCache的預設cache策略是‘ASIAskServerIfModifiedWhenStaleCachePolicy’. 

ASIDoNotReadFromCacheCachePolicy

使用這一項,request將不會從cache中讀取資料

ASIDoNotWriteToCacheCachePolicy

使用這一項,request將不會把資料存入cache

ASIAskServerIfModifiedWhen

StaleCachePolicy

這是ASIDownloadCaches的預設cache策略。使用這個策略時,request會先查看cache中是否有可用的快取資料。如果沒有,request會像普通request那樣工作。

如果有快取資料並且快取資料沒有到期,那麼request會使用緩衝的資料,而且不會向伺服器通訊。如果快取資料到期了,request會先進行GET請求來想伺服器詢問資料是否有新的版本。如果伺服器說緩衝的資料就是目前的版本,那麼快取資料將被使用,不會下載新資料。在這種情況下,cache的有效期間將被設定為伺服器端提供的新的有效期間。如果伺服器提供更新的內容,那麼新內容會被下載,並且新的資料以及它的有效期間將被寫入cache。

ASIAskServerIfModifiedCachePolicy

這一項與ASIAskServerIfModifiedWhenStaleCachePolicy相同,除了一點:request將會每次都詢問伺服器端資料是否有更新。

ASIOnlyLoadIfNotCachedCachePolicy

使用這一項,cache資料將一直被使用,無視到期時間

ASIDontLoadCachePolicy

使用這一項時,只有當響應資料有緩衝時,request才會成功。如果一個request沒有緩衝的響應資料,那麼這個request將會停止,並且不會有錯誤設定在request上。

ASIFallbackToCacheIf

LoadFailsCachePolicy

當使用這一項時,當request失敗時,request會回頭請求cache資料。如果請求失敗後,request使用的cache資料,那麼這個request會成功沒有錯誤)。你通常會將這一項與其他項結合使用,因為它適用於指定當發生錯誤時request的行為。

當你設定了一個cache對象的defaultCachePolicy 屬性,所有使用這個cache對象的request都會使用這個cache策略,除非你為request設定了另外的策略。

儲存策略

儲存策略允許你定義一個cache可以儲存特定的相應資料多久。ASIHTTPRequest目前支援兩種儲存策略:

ASICacheForSessionDurationCacheStoragePolicy是預設值。相應資料只會在會話期間被儲存,在第一次使用cache時,或者在調用 [ASIHTTPRequest clearSession]時,資料會被清除。

使用ASICachePermanentlyCacheStoragePolicy,緩衝的相應資料會被永久儲存。要使用這個儲存策略,向request設定:

 
  1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  2. [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 

要手動清除cache,調用函數clearCachedResponsesForStoragePolicy:,傳入要清除的cache資料的儲存策略:

 
  1. [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 
其他cache相關的特性
 
  1. // 當你關閉 shouldRespectCacheControlHeaders,cache對象會儲存響應資料,而無視 
  2. // 伺服器的顯式“請勿緩衝”聲明 (例如:cache-control 或者pragma: no-cache 頭) 
  3. [[ASIDownloadCache sharedCache] setShouldRespectCacheControlHeaders:NO]; 
  4.  
  5. // 可以設定request的secondsToCache來覆蓋伺服器設定的內容有效期間, 這時,響應資料 
  6. // 會一直被緩衝,直到經過secondsToCache秒 
  7. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  8. [request setSecondsToCache:60*60*24*30]; // 緩衝30 天 
  9.  
  10. //當request開始執行後,如果響應資料是從緩衝中取得的,didUseCachedResponse 會返回YES 
  11. [request didUseCachedResponse]; 
  12.  
  13. // 向cache對象索取一個路徑來儲存相應資料. 這是使用download cache的最有效率的方法, 
  14. // 因為此時,當request完成後,資料不需要被複製到cache中. 
  15. [request setDownloadDestinationPath: 
  16.    [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:request]]; 
編寫自己的cache

如果你已經持有一個download cache並且想將他插入ASIHTTPRequest中,或者你喜歡自己寫自己的download cache,那麼讓你的cache實現ASICacheDelegate協議。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.