內存緩存機制

前面一片文章介紹瞭如何上傳和下載文件,這篇文章將介紹一下如何在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多次請求。看下面代碼:

[plain] view plaincopy
  1. -(IBAction) buttonPress:(id) sender    
  2.   
  3. {    
  4.   
  5.     NSString *paramURLAsString= @"http://www.baidu.com/";    
  6.   
  7.     if ([paramURLAsString length] == 0){    
  8.   
  9.         NSLog(@"Nil or empty URL is given");    
  10.   
  11.         return;    
  12.   
  13.     }    
  14.   
  15.     NSURLCache *urlCache = [NSURLCache sharedURLCache];    
  16.   
  17.     /* 設置緩存的大小爲1M*/   
  18.   
  19.     [urlCache setMemoryCapacity:1*1024*1024];    
  20.   
  21.      //創建一個nsurl    
  22.   
  23.     NSURL *url = [NSURL URLWithString:paramURLAsString];    
  24.   
  25.         //創建一個請求    
  26.   
  27.     NSMutableURLRequest *request =    
  28.   
  29.     [NSMutableURLRequest   
  30.   
  31.      requestWithURL:url    
  32.   
  33.      cachePolicy:NSURLRequestUseProtocolCachePolicy   
  34.   
  35.      timeoutInterval:60.0f];    
  36.   
  37.      //從請求中獲取緩存輸出    
  38.   
  39.     NSCachedURLResponse *response =    
  40.   
  41.     [urlCache cachedResponseForRequest:request];    
  42.   
  43.     //判斷是否有緩存    
  44.   
  45.     if (response != nil){    
  46.   
  47.         NSLog(@"如果有緩存輸出,從緩存中獲取數據");    
  48.   
  49.         [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];    
  50.   
  51.     }    
  52.   
  53.     self.connection = nil;    
  54.   
  55.     /* 創建NSURLConnection*/   
  56.   
  57.     NSURLConnection *newConnection =    
  58.   
  59.     [[NSURLConnection alloc] initWithRequest:request    
  60.   
  61.                                     delegate:self   
  62.   
  63.                             startImmediately:YES];    
  64.   
  65.     self.connection = newConnection;    
  66.   
  67.     [newConnection release];    
  68.   
  69. }   

這個例子中,我們請求url爲www.baidu.com的網站。如果這個url被緩存了,我們直接從緩存中獲取數據,否則從www.baidu.com站點上重新獲取數據。我們設置了緩存大小爲1M。

使用下面代碼,我將請求的過程打印出來:

[plain] view plaincopy
  1. - (void)  connection:(NSURLConnection *)connection    
  2.   
  3.   didReceiveResponse:(NSURLResponse *)response{    
  4.   
  5.     NSLog(@"將接收輸出");    
  6.   
  7. }    
  8.   
  9. - (NSURLRequest *)connection:(NSURLConnection *)connection    
  10.   
  11.              willSendRequest:(NSURLRequest *)request    
  12.   
  13.             redirectResponse:(NSURLResponse *)redirectResponse{    
  14.   
  15.     NSLog(@"即將發送請求");    
  16.   
  17.     return(request);    
  18.   
  19. }    
  20.   
  21. - (void)connection:(NSURLConnection *)connection    
  22.   
  23.     didReceiveData:(NSData *)data{    
  24.   
  25.     NSLog(@"接受數據");    
  26.   
  27.     NSLog(@"數據長度爲 = %lu", (unsigned long)[data length]);    
  28.   
  29. }    
  30.   
  31. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection    
  32.   
  33.                   willCacheResponse:(NSCachedURLResponse *)cachedResponse{    
  34.   
  35.     NSLog(@"將緩存輸出");    
  36.   
  37.     return(cachedResponse);    
  38.   
  39. }    
  40.   
  41. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{    
  42.   
  43.     NSLog(@"請求完成");    
  44.   
  45. }    
  46.   
  47. - (void)connection:(NSURLConnection *)connection    
  48.   
  49.   didFailWithError:(NSError *)error{    
  50.   
  51.     NSLog(@"請求失敗");    
  52.   
  53. }   


 

當我們第一次點擊界面上的按鈕,打印的結果如下:

[html] view plaincopy
  1. 2011-07-30 18:50:24.910 Caching[3971:207] 即將發送請求    
  2.   
  3. 2011-07-30 18:50:28.557 Caching[3971:207] 將接收輸出    
  4.   
  5. 2011-07-30 18:50:31.677 Caching[3971:207] 接受數據    
  6.   
  7. 2011-07-30 18:50:31.681 Caching[3971:207] 數據長度爲 = 4414    
  8.   
  9. 2011-07-30 18:50:31.682 Caching[3971:207] 接受數據    
  10.   
  11. 2011-07-30 18:50:31.682 Caching[3971:207] 數據長度爲 = 2996    
  12.   
  13. 2011-07-30 18:50:38.107 Caching[3971:207] 將緩存輸出    
  14.   
  15. 2011-07-30 18:50:38.109 Caching[3971:207] 請求完成   


 

在看我們第二次點擊界面上的按鈕,打印結果如下:

2011-07-30 18:52: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] 請求完成

我們看到沒有“將緩存輸出”一項,請求到的數據是第一次請求的累積,也就是第二次是從內存中獲取數據的。

總結:本文簡單的介紹了一下iOS的內存緩存機制,下一篇文章將重點介紹一下本地緩存機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章