標籤:
ASI的緩衝是ASI的一大特色,和蘋果原生的NSURLCache一樣,也提供了一個單例對象[ASIDownloadCache sharedCache]
1.ASI使用緩衝的條件
1>必須是GET請求
2>請求成功,狀態代碼是200
2.單個請求怎麼使用ASI緩衝
// 設定URL
NSURL *url = [NSURL URLWithString:@"http://localhots/123.png"];
// 初始化請求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 監聽請求
__weak typeof(request) temp = request; // 避免Block循環參考
[request setCompletionBlock:^{
NSLog(@"----%@",temp.responseString);
}];
// 佈建要求的緩衝策略
// 第1種方式,拿到ASIDownloadCache單例對象,設定預設緩衝策略;然後將這個單例設定為request的downloadCache(成員變數)
ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
[cache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setDownloadCache:cache];
// 第2種方式,不用ASIDownloadCache的單例對象,自己建立一個ASIDownloadCache對象,然後設定cache對象的緩衝路徑和預設緩衝策略,然後將這個cache對象設定為request的downloadCache(成員變數)
ASIDownloadCache *myCache = [[ASIDownloadCache alloc]init];
myCache.storagePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"myCache"];
myCache.defaultCachePolicy = ASIOnlyLoadIfNotCachedCachePolicy;
[request setDownloadCache:myCache];
// 佈建要求的緩衝時間長度,有2種,分別是會話緩衝和硬碟緩衝
[request setCacheStoragePolicy:ASICacheForSessionDurationCacheStoragePolicy];
補充說明:
Question1:為什麼 ASIDownloadCache的單例對象,不需要設定緩衝路徑,而自訂的ASIDownloadCache對象就需要設定緩衝路徑?
因為[ASIDownloadCache sharedCache]方法裡,已經設定了緩衝路徑,可以跳進這個方法裡看看.
Question2:CachePolicy,CacheStoragePolicy分別代表什麼含義?
CachePolicy表示什麼時候載入緩衝,什麼時候載入網路資料
CacheStoragePolicy表示緩衝的時間長度
3.多個請求怎麼使用ASI緩衝
// 佈建要求1和請求2
NSURL *url1 = [NSURL URLWithString:@"xxxxxx"];
ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
NSURL *url2 = [NSURL URLWithString:@"xxxxxxxxxxxxx"];
ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
// 預設的緩衝管理對象
ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
[cache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy];
// 佈建要求1的緩衝
[request1 setDownloadCache:cache];
request1.cachePolicy = ASIOnlyLoadIfNotCachedCachePolicy; // 根據就近原則,request1最終的cachePolicy=ASIOnlyLoadIfNotCachedCachePolicy
request1.cacheStoragePolicy = ASICacheForSessionDurationCacheStoragePolicy;
// 佈建要求2的緩衝
[request2 setDownloadCache:cache];
// request2沒設定cachePolicy,所以request2的cachePolicy = 預設的緩衝管理cache的DefaultCachePolicy
request2.cacheStoragePolicy =ASICachePermanentlyCacheStoragePolicy;
補充說明:
1>ASIDownloadCache作用就是設定request的緩衝路徑,另外1個作用是提供了預設的DefaultCachePolicy
2>在這個緩衝路徑下會有2個檔案夾,1個是硬碟緩衝,另1個是臨時緩衝,request.cacheStoragePolicy決定了緩衝在具體哪個檔案夾下.所以request.downloadCache 和 request.cacheStoragePolicy必須設定,只有這2個屬性,都設定才能最終確定緩衝 儲存的路徑
3>request.cachePolicy,可根據實際需求決定是否設定.
如果request要遵從全域的緩衝策略,就不用設定,它會取ASIDownloadCache的DefaultCachePolicy
如果request有它自己個人化的地方,就要設定,它會根據就近原則,取自己的cachePolicy作為最終的緩衝策略
4.每個request都要設定downloadCache還是比較麻煩,所以ASI提供了便捷方法
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
5.緩衝的其他特性
[request setSecondsToCache:60 * 60 * 24 * 7]; // 有效期間7天
BOOL isUseCache = [request didUseCachedResponse]; // 判斷資料是否來自緩衝
iOS ASI--緩衝