iOS開發(fā)之內(nèi)存緩存機(jī)制
使用緩存的目的是為了使用的應(yīng)用程序能更快速的響應(yīng)用戶輸入,是程序高效的運行。有時候我們需要將遠(yuǎn)程web服務(wù)器獲取的數(shù)據(jù)緩存起來,減少對同一個url多次請求。
內(nèi)存緩存我們可以使用sdk中的NSURLCache類。NSURLRequest需要一個緩存參數(shù)來說明它請求的url何如緩存數(shù)據(jù)的,我們先看下它的CachePolicy類型。
1、NSURLRequestUseProtocolCachePolicy NSURLRequest默認(rèn)的cache policy,使用Protocol協(xié)議定義。
2、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載。
4、NSURLRequestReturnCacheDataDontLoad 只使用cache數(shù)據(jù),如果不存在cache,請求失敗;用于沒有建立網(wǎng)絡(luò)連接離線模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠(yuǎn)程的緩存數(shù)據(jù),直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData類似。
6、NSURLRequestReloadRevalidatingCacheData:驗證本地數(shù)據(jù)與遠(yuǎn)程數(shù)據(jù)是否相同,如果不同則下載遠(yuǎn)程數(shù)據(jù),否則使用本地數(shù)據(jù)。
NSURLCache還提供了很多方法,來方便我們實現(xiàn)應(yīng)用程序的緩存機(jī)制。下面我通過一個例子來說明,這個例子減少我們對同一個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];
- /* 設(shè)置緩存的大小為1M*/
- [urlCache setMemoryCapacity:1*1024*1024];
- //創(chuàng)建一個nsurl
- NSURL *url = [NSURL URLWithString:paramURLAsString];
- //創(chuàng)建一個請求
- NSMutableURLRequest *request =
- [NSMutableURLRequest
- requestWithURL:url
- cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:60.0f];
- //從請求中獲取緩存輸出
- NSCachedURLResponse *response =
- [urlCache cachedResponseForRequest:request];
- //判斷是否有緩存
- if (response != nil){
- NSLog(@"如果有緩存輸出,從緩存中獲取數(shù)據(jù)");
- [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
- }
- self.connection = nil;
- /* 創(chuàng)建NSURLConnection*/
- NSURLConnection *newConnection =
- [[NSURLConnection alloc] initWithRequest:request
- delegate:self
- startImmediately:YES];
- self.connection = newConnection;
- [newConnection release];
- }
這個例子中,我們請求url為www.baidu.com的網(wǎng)站。如果這個url被緩存了,我們直接從緩存中獲取數(shù)據(jù),否則從www.baidu.com站點上重新獲取數(shù)據(jù)。我們設(shè)置了緩存大小為1M。
使用下面代碼,我將請求的過程打印出來:
- - (void) connection:(NSURLConnection *)connection
- didReceiveResponse:(NSURLResponse *)response{
- NSLog(@"將接收輸出");
- }
- - (NSURLRequest *)connection:(NSURLConnection *)connection
- willSendRequest:(NSURLRequest *)request
- redirectResponse:(NSURLResponse *)redirectResponse{
- NSLog(@"即將發(fā)送請求");
- return(request);
- }
- - (void)connection:(NSURLConnection *)connection
- didReceiveData:(NSData *)data{
- NSLog(@"接受數(shù)據(jù)");
- NSLog(@"數(shù)據(jù)長度為 = %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(@"請求失敗");
- }
當(dāng)我們***次點擊界面上的按鈕,打印的結(jié)果如下:
- 2011-07-30 18:50:24.910 Caching[3971:207] 即將發(fā)送請求
- 2011-07-30 18:50:28.557 Caching[3971:207] 將接收輸出
- 2011-07-30 18:50:31.677 Caching[3971:207] 接受數(shù)據(jù)
- 2011-07-30 18:50:31.681 Caching[3971:207] 數(shù)據(jù)長度為 = 4414
- 2011-07-30 18:50:31.682 Caching[3971:207] 接受數(shù)據(jù)
- 2011-07-30 18:50:31.682 Caching[3971:207] 數(shù)據(jù)長度為 = 2996
- 2011-07-30 18:50:38.107 Caching[3971:207] 將緩存輸出
- 2011-07-30 18:50:38.109 Caching[3971:207] 請求完成
在看我們第二次點擊界面上的按鈕,打印結(jié)果如下:
- 2011-07-30 18:52:18.894 Caching[3971:207] 即將發(fā)送請求
- 2011-07-30 18:52:18.895 Caching[3971:207] 將接收輸出
- 2011-07-30 18:52:18.895 Caching[3971:207] 接受數(shù)據(jù)
- 2011-07-30 18:52:18.896 Caching[3971:207] 數(shù)據(jù)長度為 = 7410
- 2011-07-30 18:52:18.896 Caching[3971:207] 請求完成
我們看到?jīng)]有“將緩存輸出”一項,請求到的數(shù)據(jù)是***次請求的累積,也就是第二次是從內(nèi)存中獲取數(shù)據(jù)的。