iOS開發(fā)ASIHTTPRequest使用download cache
本文為大家介紹了iOS開發(fā)ASIHTTPRequest使用download cache的內(nèi)容,其中包括cache策略,存儲策略,其他cache相關(guān)的特性,編寫自己的cache等等內(nèi)容。
從1.8版本開始,ASIDownloadCache和ASICacheDelegate的API改變了,你可能需要修改你的代碼。
尤其是,cache策略的可用選項發(fā)生了改變,你現(xiàn)在可以對單一request使用結(jié)合的cache策略
ASIHTTPRequest可以自動緩存下載的數(shù)據(jù),在很多情況下這很有用。
- 當(dāng)你離線時,你無法再次下載數(shù)據(jù),而你又需要訪問這些數(shù)據(jù)
- 從上次下載這些數(shù)據(jù)后,你只想在數(shù)據(jù)更新后才下載新的數(shù)據(jù)
- 你處理的數(shù)據(jù)永遠不會發(fā)生改變,所以你只想下載一次數(shù)據(jù)
在之前版本的ASIHTTPRequest里,遇到上述情況,你只能自己處理這些策略。在一些情況下,使用download cache可以讓你不用再寫本地緩存機制。
ASIDownloadCache 是個簡單的URL cache,可以用來緩存GET請求的相應(yīng)數(shù)據(jù)。一個request要被緩存,它首先必須請求成功(沒有發(fā)送錯誤),服務(wù)器必須返回200HTTP狀態(tài)值?;蛘撸瑥?.8.1版本開始,301,302,303,307重定向狀態(tài)碼都可以。
要打開響應(yīng)值的cache機制很簡單:
- [ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
這樣做以后,所有的request都會自動使用cache。如果你愿意,你可以讓不同的request使用共享的cache:
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setDownloadCache:[ASIDownloadCache sharedCache]];
你不會被局限于使用單一的cache,你可以想創(chuàng)建多少cache就創(chuàng)建多少cache,只要你喜歡 ^ ^。當(dāng)你自己創(chuàng)建一個cache,你必須設(shè)定cache的路徑——這路徑必須是一個你擁有寫權(quán)限的目錄。
- ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];
- [cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];
- //別忘了 - 你必須自己retaining你自己的cache!
- [self setMyCache:cache];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setDownloadCache:[self myCache]];
cache策略
cache策略是你控制cache中信息的主要方法,控制何時使用cache數(shù)據(jù)而非重新下載數(shù)據(jù)。
每個request的cache策略可是由request的cachePolicy 屬性來控制的。cache策略使用掩碼來定義,所以你可以二進制“與”操作他們。
- // 每次都向服務(wù)器詢問是否有新的內(nèi)容可用,
- // 如果請求失敗, 使用cache的數(shù)據(jù),即使這個數(shù)據(jù)已經(jīng)過期了
- [request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
你可以使用下列cache策略選項來控制request的緩存策略:
| ASIUseDefaultCachePolicy |
默認的cache 策略。請勿將這一項與其他項結(jié)合使用。當(dāng)你設(shè)置一個request使用cache,它會使用cache的defaultCachePolicy. ASIDownloadCache的默認cache策略是‘ASIAskServerIfModifiedWhenStaleCachePolicy’. |
|---|---|
| ASIDoNotReadFromCacheCachePolicy |
使用這一項,request將不會從cache中讀取數(shù)據(jù) |
| ASIDoNotWriteToCacheCachePolicy |
使用這一項,request將不會把數(shù)據(jù)存入cache |
|
ASIAskServerIfModifiedWhen StaleCachePolicy |
這是ASIDownloadCaches的默認cache策略。使用這個策略時,request會先查看cache中是否有可用的緩存數(shù)據(jù)。如果沒有,request會像普通request那樣工作。 如果有緩存數(shù)據(jù)并且緩存數(shù)據(jù)沒有過期,那么request會使用緩存的數(shù)據(jù),而且不會向服務(wù)器通信。如果緩存數(shù)據(jù)過期了,request會先進行GET請求來想服務(wù)器詢問數(shù)據(jù)是否有新的版本。如果服務(wù)器說緩存的數(shù)據(jù)就是當(dāng)前版本,那么緩存數(shù)據(jù)將被使用,不會下載新數(shù)據(jù)。在這種情況下,cache的有效期將被設(shè)定為服務(wù)器端提供的新的有效期。如果服務(wù)器提供更新的內(nèi)容,那么新內(nèi)容會被下載,并且新的數(shù)據(jù)以及它的有效期將被寫入cache。 |
| ASIAskServerIfModifiedCachePolicy |
這一項與ASIAskServerIfModifiedWhenStaleCachePolicy相同,除了一點:request將會每次都詢問服務(wù)器端數(shù)據(jù)是否有更新。 |
| ASIOnlyLoadIfNotCachedCachePolicy |
使用這一項,cache數(shù)據(jù)將一直被使用,無視過期時間 |
| ASIDontLoadCachePolicy |
使用這一項時,只有當(dāng)響應(yīng)數(shù)據(jù)有緩存時,request才會成功。如果一個request沒有緩存的響應(yīng)數(shù)據(jù),那么這個request將會停止,并且不會有錯誤設(shè)置在request上。 |
|
ASIFallbackToCacheIf LoadFailsCachePolicy |
當(dāng)使用這一項時,當(dāng)request失敗時,request會回頭請求cache數(shù)據(jù)。如果請求失敗后,request使用的cache數(shù)據(jù),那么這個request會成功(沒有錯誤)。你通常會將這一項與其他項結(jié)合使用,因為它適用于指定當(dāng)發(fā)生錯誤時request的行為。 |
當(dāng)你設(shè)定了一個cache對象的defaultCachePolicy 屬性,所有使用這個cache對象的request都會使用這個cache策略,除非你為request設(shè)置了另外的策略。
存儲策略
存儲策略允許你定義一個cache可以存儲特定的相應(yīng)數(shù)據(jù)多久。ASIHTTPRequest目前支持兩種存儲策略:
ASICacheForSessionDurationCacheStoragePolicy是默認值。相應(yīng)數(shù)據(jù)只會在會話期間被存儲,在第一次使用cache時,或者在調(diào)用 [ASIHTTPRequest clearSession]時,數(shù)據(jù)會被清除。
使用ASICachePermanentlyCacheStoragePolicy,緩存的相應(yīng)數(shù)據(jù)會被永久存儲。要使用這個存儲策略,向request設(shè)置:
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
要手動清除cache,調(diào)用函數(shù)clearCachedResponsesForStoragePolicy:,傳入要清除的cache數(shù)據(jù)的存儲策略:
- [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
其他cache相關(guān)的特性
- // 當(dāng)你關(guān)閉 shouldRespectCacheControlHeaders,cache對象會存儲響應(yīng)數(shù)據(jù),而無視
- // 服務(wù)器的顯式“請勿緩存”聲明 (例如:cache-control 或者pragma: no-cache 頭)
- [[ASIDownloadCache sharedCache] setShouldRespectCacheControlHeaders:NO];
- // 可以設(shè)定request的secondsToCache來覆蓋服務(wù)器設(shè)定的內(nèi)容有效期, 這時,響應(yīng)數(shù)據(jù)
- // 會一直被緩存,直到經(jīng)過secondsToCache秒
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setSecondsToCache:60*60*24*30]; // 緩存30 天
- //當(dāng)request開始執(zhí)行后,如果響應(yīng)數(shù)據(jù)是從緩存中取得的,didUseCachedResponse 會返回YES
- [request didUseCachedResponse];
- // 向cache對象索取一個路徑來存儲相應(yīng)數(shù)據(jù). 這是使用download cache的最有效率的方法,
- // 因為此時,當(dāng)request完成后,數(shù)據(jù)不需要被復(fù)制到cache中.
- [request setDownloadDestinationPath:
- [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:request]];
編寫自己的cache
如果你已經(jīng)持有一個download cache并且想將他插入ASIHTTPRequest中,或者你喜歡自己寫自己的download cache,那么讓你的cache實現(xiàn)ASICacheDelegate協(xié)議。

















