在IOS應用程序開發中,爲了減小與服務端的交互次數,加快用戶的響應速度,通常都會在iOS設備中加一個緩存的機制。
這篇文章將介紹一下如何在iOS設備中進行緩存,本文先介紹一下將內容緩存到內存中,下一篇文章就介紹一下在iOS磁盤上緩存內容。
使用緩存的目的是爲了使用的應用程序能更快速的響應用戶輸入,是程序高效的運行。有時候咱們須要將遠程web服務器獲取的數據緩存起來,減小對同一個url屢次請求。
內存緩存咱們可使用sdk中的NSURLCache類。NSURLRequest須要一個緩存參數來講明它請求的url何如緩存數據的,咱們先看下它的CachePolicy類型。
一、NSURLRequestUseProtocolCachePolicy NSURLRequest默認的cache policy,使用Protocol協議定義。
二、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
三、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載。
四、NSURLRequestReturnCacheDataDontLoad 只使用cache數據,若是不存在cache,請求失敗;用於沒有創建網絡鏈接離線模式;
五、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠程的緩存數據,直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData相似。
六、NSURLRequestReloadRevalidatingCacheData:驗證本地數據與遠程數據是否相同,若是不一樣則下載遠程數據,不然使用本地數據。
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] 請求完成
在看咱們第二次點擊界面上的按鈕,打印結果以下:
2011-07-30 18:5:18.894 Caching[3971:207] 即將發送請求
2011-07-30 18:52:18.895 Caching[3971:207] 將接收輸出
2011-07-30 18:52:18.895 Caching[3971:207] 接受數據
2011-07-30 18:52:18.896 Caching[3971:207] 數據長度爲 = 7410
2011-07-30 18:52:18.896 Caching[3971:207] 請求完成
咱們看到沒有「將緩存輸出」一項,請求到的數據是第一次請求的累積,也就是第二次是從內存中獲取數據的。