閱讀586 返回首頁    go 技術社區[雲棲]


iOS開發緩存機製之—內存緩存機製

在IOS應用程序開發中,為了減少與服務端的交互次數,加快用戶的響應速度,一般都會在iOS設備中加一個緩存的機製。

這篇文章將介紹一下如何在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類似。
6、NSURLRequestReloadRevalidatingCacheData:驗證本地數據與遠程數據是否相同,如果不同則下載遠程數據,否則使用本地數據。

NSURLCache還提供了很多方法,來方便我們實現應用程序的緩存機製。下麵我通過一個例子來說明,這個例子減少我們對同一個url多次請求。看下麵代碼:

-(IBAction) buttonPress:(id) sender

{

NSString *paramURLAsString= @”https://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] 請求完成

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

轉自iOS分享網 https://iosshare.cn


最後更新:2017-04-02 15:15:17

  上一篇:go 職場白領強迫症三大典型症狀
  下一篇:go Java基礎知識——SDK、JDK、JRE、JVM、JDT、CDT等之間的區別與聯係