iOS开发缓存机制之—内存缓存机制
生活随笔
收集整理的這篇文章主要介紹了
iOS开发缓存机制之—内存缓存机制
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在IOS應(yīng)用程序開發(fā)中,為了減少與服務(wù)端的交互次數(shù),加快用戶的響應(yīng)速度,一般都會(huì)在iOS設(shè)備中加一個(gè)緩存的機(jī)制。這篇文章將介紹一下如何在iOS設(shè)備中進(jìn)行緩存,本文先介紹一下將內(nèi)容緩存到內(nèi)存中,下一篇文章就介紹一下在iOS磁盤上緩存內(nèi)容。使用緩存的目的是為了使用的應(yīng)用程序能更快速的響應(yīng)用戶輸入,是程序高效的運(yùn)行。有時(shí)候我們需要將遠(yuǎn)程web服務(wù)器獲取的數(shù)據(jù)緩存起來,減少對(duì)同一個(gè)url多次請(qǐng)求。內(nèi)存緩存我們可以使用sdk中的NSURLCache類。NSURLRequest需要一個(gè)緩存參數(shù)來說明它請(qǐng)求的url何如緩存數(shù)據(jù)的,我們先看下它的CachePolicy類型。1、NSURLRequestUseProtocolCachePolicy NSURLRequest默認(rèn)的cache policy,使用Protocol協(xié)議定義。
2、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時(shí)才從原始地址下載。
4、NSURLRequestReturnCacheDataDontLoad 只使用cache數(shù)據(jù),如果不存在cache,請(qǐng)求失敗;用于沒有建立網(wǎng)絡(luò)連接離線模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠(yuǎn)程的緩存數(shù)據(jù),直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData類似。
6、NSURLRequestReloadRevalidatingCacheData:驗(yàn)證本地?cái)?shù)據(jù)與遠(yuǎn)程數(shù)據(jù)是否相同,如果不同則下載遠(yuǎn)程數(shù)據(jù),否則使用本地?cái)?shù)據(jù)。NSURLCache還提供了很多方法,來方便我們實(shí)現(xiàn)應(yīng)用程序的緩存機(jī)制。下面我通過一個(gè)例子來說明,這個(gè)例子減少我們對(duì)同一個(gè)url多次請(qǐng)求??聪旅娲a:-(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)建一個(gè)nsurlNSURL *url = [NSURL URLWithString:paramURLAsString];//創(chuàng)建一個(gè)請(qǐng)求NSMutableURLRequest *request =[NSMutableURLRequestrequestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:60.0f];//從請(qǐng)求中獲取緩存輸出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:requestdelegate:selfstartImmediately:YES];self.connection = newConnection;[newConnection release];}這個(gè)例子中,我們請(qǐng)求url為www.baidu.com的網(wǎng)站。如果這個(gè)url被緩存了,我們直接從緩存中獲取數(shù)據(jù),否則從www.baidu.com站點(diǎn)上重新獲取數(shù)據(jù)。我們?cè)O(shè)置了緩存大小為1M。使用下面代碼,我將請(qǐng)求的過程打印出來:- (void)? connection:(NSURLConnection *)connectiondidReceiveResponse:(NSURLResponse *)response{NSLog(@”將接收輸出”);}- (NSURLRequest *)connection:(NSURLConnection *)connectionwillSendRequest:(NSURLRequest *)requestredirectResponse:(NSURLResponse *)redirectResponse{NSLog(@”即將發(fā)送請(qǐng)求”);return(request);}- (void)connection:(NSURLConnection *)connectiondidReceiveData:(NSData *)data{NSLog(@”接受數(shù)據(jù)”);NSLog(@”數(shù)據(jù)長(zhǎng)度為 = %lu”, (unsigned long)[data length]);}- (NSCachedURLResponse *)connection:(NSURLConnection *)connectionwillCacheResponse:(NSCachedURLResponse *)cachedResponse{NSLog(@”將緩存輸出”);return(cachedResponse);}- (void)connectionDidFinishLoading:(NSURLConnection *)connection{NSLog(@”請(qǐng)求完成”);}- (void)connection:(NSURLConnection *)connectiondidFailWithError:(NSError *)error{NSLog(@”請(qǐng)求失敗”);}當(dāng)我們第一次點(diǎn)擊界面上的按鈕,打印的結(jié)果如下:2011-07-30 18:50:24.910 Caching[3971:207] 即將發(fā)送請(qǐng)求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ù)長(zhǎng)度為 = 44142011-07-30 18:50:31.682 Caching[3971:207] 接受數(shù)據(jù)2011-07-30 18:50:31.682 Caching[3971:207] 數(shù)據(jù)長(zhǎng)度為 = 29962011-07-30 18:50:38.107 Caching[3971:207] 將緩存輸出2011-07-30 18:50:38.109 Caching[3971:207] 請(qǐng)求完成在看我們第二次點(diǎn)擊界面上的按鈕,打印結(jié)果如下:2011-07-30 18:5:18.894 Caching[3971:207] 即將發(fā)送請(qǐng)求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ù)長(zhǎng)度為 = 74102011-07-30 18:52:18.896 Caching[3971:207] 請(qǐng)求完成 我們看到?jīng)]有“將緩存輸出”一項(xiàng),請(qǐng)求到的數(shù)據(jù)是第一次請(qǐng)求的累積,也就是第二次是從內(nèi)存中獲取數(shù)據(jù)的。轉(zhuǎn)自iOS分享網(wǎng) http://iosshare.cn
2、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時(shí)才從原始地址下載。
4、NSURLRequestReturnCacheDataDontLoad 只使用cache數(shù)據(jù),如果不存在cache,請(qǐng)求失敗;用于沒有建立網(wǎng)絡(luò)連接離線模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠(yuǎn)程的緩存數(shù)據(jù),直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData類似。
6、NSURLRequestReloadRevalidatingCacheData:驗(yàn)證本地?cái)?shù)據(jù)與遠(yuǎn)程數(shù)據(jù)是否相同,如果不同則下載遠(yuǎn)程數(shù)據(jù),否則使用本地?cái)?shù)據(jù)。NSURLCache還提供了很多方法,來方便我們實(shí)現(xiàn)應(yīng)用程序的緩存機(jī)制。下面我通過一個(gè)例子來說明,這個(gè)例子減少我們對(duì)同一個(gè)url多次請(qǐng)求??聪旅娲a:-(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)建一個(gè)nsurlNSURL *url = [NSURL URLWithString:paramURLAsString];//創(chuàng)建一個(gè)請(qǐng)求NSMutableURLRequest *request =[NSMutableURLRequestrequestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:60.0f];//從請(qǐng)求中獲取緩存輸出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:requestdelegate:selfstartImmediately:YES];self.connection = newConnection;[newConnection release];}這個(gè)例子中,我們請(qǐng)求url為www.baidu.com的網(wǎng)站。如果這個(gè)url被緩存了,我們直接從緩存中獲取數(shù)據(jù),否則從www.baidu.com站點(diǎn)上重新獲取數(shù)據(jù)。我們?cè)O(shè)置了緩存大小為1M。使用下面代碼,我將請(qǐng)求的過程打印出來:- (void)? connection:(NSURLConnection *)connectiondidReceiveResponse:(NSURLResponse *)response{NSLog(@”將接收輸出”);}- (NSURLRequest *)connection:(NSURLConnection *)connectionwillSendRequest:(NSURLRequest *)requestredirectResponse:(NSURLResponse *)redirectResponse{NSLog(@”即將發(fā)送請(qǐng)求”);return(request);}- (void)connection:(NSURLConnection *)connectiondidReceiveData:(NSData *)data{NSLog(@”接受數(shù)據(jù)”);NSLog(@”數(shù)據(jù)長(zhǎng)度為 = %lu”, (unsigned long)[data length]);}- (NSCachedURLResponse *)connection:(NSURLConnection *)connectionwillCacheResponse:(NSCachedURLResponse *)cachedResponse{NSLog(@”將緩存輸出”);return(cachedResponse);}- (void)connectionDidFinishLoading:(NSURLConnection *)connection{NSLog(@”請(qǐng)求完成”);}- (void)connection:(NSURLConnection *)connectiondidFailWithError:(NSError *)error{NSLog(@”請(qǐng)求失敗”);}當(dāng)我們第一次點(diǎn)擊界面上的按鈕,打印的結(jié)果如下:2011-07-30 18:50:24.910 Caching[3971:207] 即將發(fā)送請(qǐng)求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ù)長(zhǎng)度為 = 44142011-07-30 18:50:31.682 Caching[3971:207] 接受數(shù)據(jù)2011-07-30 18:50:31.682 Caching[3971:207] 數(shù)據(jù)長(zhǎng)度為 = 29962011-07-30 18:50:38.107 Caching[3971:207] 將緩存輸出2011-07-30 18:50:38.109 Caching[3971:207] 請(qǐng)求完成在看我們第二次點(diǎn)擊界面上的按鈕,打印結(jié)果如下:2011-07-30 18:5:18.894 Caching[3971:207] 即將發(fā)送請(qǐng)求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ù)長(zhǎng)度為 = 74102011-07-30 18:52:18.896 Caching[3971:207] 請(qǐng)求完成 我們看到?jīng)]有“將緩存輸出”一項(xiàng),請(qǐng)求到的數(shù)據(jù)是第一次請(qǐng)求的累積,也就是第二次是從內(nèi)存中獲取數(shù)據(jù)的。轉(zhuǎn)自iOS分享網(wǎng) http://iosshare.cn
總結(jié)
以上是生活随笔為你收集整理的iOS开发缓存机制之—内存缓存机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]sudoers设置
- 下一篇: C 内存分配【转】