前置知識:
http協議內建的Last-Modified和ETag,詳細的網上搜尋下就行了。簡單來說就是,伺服器在返回資源時包含一個ID(時間或是某種token),用戶端緩衝該ID,下一次再請求同一資源時,包含這個ID,伺服器根據此ID來判斷資源是否改變,從而返回不同的結果(200或是304)。
Three20實現的預設緩衝方案是:
TTURLRequestCachePolicyDefault
= (TTURLRequestCachePolicyMemory | TTURLRequestCachePolicyDisk
| TTURLRequestCachePolicyNetwork),
TTURLRequestCachePolicyNetwork 代表使用 Last-Modified 策略,
TTURLRequestCachePolicyMemory | TTURLRequestCachePolicyDisk 代表使用記憶體和檔案快取資源和資源ID,
改變緩衝方案:
TTURLRequest request;
//blah,blah
request.cachePolicy = cachePolicy | TTURLRequestCachePolicyEtag;
這裡增加了Etag的功能,如果伺服器支援的話,毫無疑問這是最佳的方案。其他類推,比如不需要緩衝。
如何使用緩衝:
這裡拉一段TTImageView的代碼,一看就知道:
- (void)reload {
if (nil == _request && nil != _urlPath) {
UIImage* image = [[TTURLCache sharedCache] imageForURL:_urlPath];
if (nil != image) {
self.image = image;
} else {
TTURLRequest* request = [TTURLRequest requestWithURL:_urlPath delegate:self];
request.response = [[[TTURLImageResponse alloc] init] autorelease];
if (![request send]) {
// Put the default image in place while waiting for the request to load
if (_defaultImage && nil == self.image) {
self.image = _defaultImage;
}
}
}
}
}
使用TTURLCache的單例,可以擷取任意url資源的本機快取。這裡的邏輯是這樣的:
首先判斷記憶體中是否存在這種圖片:
UIImage* image = [[TTURLCache sharedCache] imageForURL:_urlPath]
如果不存在,發起一個request,使用預設的policy,擷取該圖片。假設該圖片上次開啟程式時已經下載過,已經緩衝在disk(這是預設的),並且圖片在伺服器上沒有變更,且伺服器支援if-modified, request預設就會返回disk上的圖片。
詳細的可以看TTURLCache
總結:
如果手動send 一個request,則預設的policy就可以很好的實現了緩衝機制。一些內建的控制項,比如TTTableView, 如果包含圖片,也實現的很理想。