前面一片文章介紹了如何上傳和下載下傳檔案,這篇文章将介紹一下如何在iOS裝置中進行緩存。
這篇文章将隻介紹一下将内容緩存到記憶體中,下一篇文章就介紹一下在iOS磁盤上緩存内容。
使用緩存的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的運作。有時候我們需要将遠端web伺服器擷取的資料緩存起來,減少對同一個url多次請求。
記憶體緩存我們可以使用sdk中的NSURLCache類。NSURLRequest需要一個緩存參數來說明它請求的url何如緩存資料的,我們先看下它的CachePolicy類型。
1、NSURLRequestUseProtocolCachePolicy NSURLRequest預設的cache policy,使用Protocol協定定義。
2、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始位址下載下傳。
3、NSURLRequestReturnCacheDataElseLoad 隻有在cache中不存在data時才從原始位址下載下傳。
4、NSURLRequestReturnCacheDataDontLoad 隻使用cache資料,如果不存在cache,請求失敗;用于沒有建立網絡連接配接離線模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠端的緩存資料,直接從原始位址下載下傳,與NSURLRequestReloadIgnoringCacheData類似。
6NSURLRequestReloadRevalidatingCacheData:驗證本地資料與遠端資料是否相同,如果不同則下載下傳遠端資料,否則使用本地資料。
NSURLCache還提供了很多方法,來友善我們實作應用程式的緩存機制。下面我通過一個例子來說明,這個例子減少我們對同一個url多次請求。看下面代碼:
-(IBAction) buttonPress:(id) sender
{
NSString *paramURLAsString= @"http://www.baidu.com/";
if ([paramURLAsString length] == 0){
NSLog(@"Nil or empty URL is given");
return;
}
NSURLCache *urlCache = [NSURLCache sharedURLCache];
/* 設定緩存的大小為1M*/
[urlCache setMemoryCapacity:1*1024*1024];
//建立一個nsurl
NSURL *url = [NSURL URLWithString:paramURLAsString];
//建立一個請求
NSMutableURLRequest *request =
[NSMutableURLRequest
requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0f];
//從請求中擷取緩存輸出
NSCachedURLResponse *response =
[urlCache cachedResponseForRequest:request];
//判斷是否有緩存
if (response != nil){
NSLog(@"如果有緩存輸出,從緩存中擷取資料");
[request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
}
self.connection = nil;
/* 建立NSURLConnection*/
NSURLConnection *newConnection =
[[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
self.connection = newConnection;
[newConnection release];
}
這個例子中,我們請求url為www.baidu.com的網站。如果這個url被緩存了,我們直接從緩存中擷取資料,否則從www.baidu.com站點上重新擷取資料。我們設定了緩存大小為1M。
使用下面代碼,我将請求的過程列印出來:
- (void) connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response{
NSLog(@"将接收輸出");
}
- (NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse{
NSLog(@"即将發送請求");
return(request);
}
- (void)connection:(NSURLConnection *)connection
didReceiveData:(NSData *)data{
NSLog(@"接受資料");
NSLog(@"資料長度為 = %lu", (unsigned long)[data length]);
}
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse{
NSLog(@"将緩存輸出");
return(cachedResponse);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"請求完成");
}
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error{
NSLog(@"請求失敗");
}
當我們第一次點選界面上的按鈕,列印的結果如下:
2011-07-30 18:50:24.910 Caching[3971:207] 即将發送請求
2011-07-30 18:50:28.557 Caching[3971:207] 将接收輸出
2011-07-30 18:50:31.677 Caching[3971:207] 接受資料
2011-07-30 18:50:31.681 Caching[3971:207] 資料長度為 = 4414
2011-07-30 18:50:31.682 Caching[3971:207] 接受資料
2011-07-30 18:50:31.682 Caching[3971:207] 資料長度為 = 2996
2011-07-30 18:50:38.107 Caching[3971:207] 将緩存輸出
2011-07-30 18:50:38.109 Caching[3971:207] 請求完成
在看我們第二次點選界面上的按鈕,列印結果如下:
|
|
|
|
|
我們看到沒有“将緩存輸出”一項,請求到的資料是第一次請求的累積,也就是第二次是從記憶體中擷取資料的。
總結:本文簡單的介紹了一下iOS的記憶體緩存機制,下一篇文章将重點介紹一下本地緩存機制