在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= @"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: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的記憶體緩衝機制,下一篇文章將重點介紹一下本機快取機制
原文出處:http://blog.csdn.net/zhuqilin0/article/details/6647123#
在次感謝朱祁林 (使用者名稱:zhuqilin0) ,謝謝他的博文