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多次請求。看下面程式碼:
-( IBAction ) buttonPress:( id ) sender
{ NSString *paramURLAsString= @ "" ;
if ([paramURLAsString length] == 0){
NSLog (@ "Nil or empty URL is given" );
return ;
}
NSURLCache *urlCache = [ NSURLCache sharedURLCache];
[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 *newConnection =
[[ NSURLConnection alloc] initWithRequest:request
delegate: self
startImmediately: YES ];
self .connection = newConnection;
[newConnection release];
} |
這個例子中,我們請求url為的網站。如果這個url被快取了,我們直接從快取中獲取資料,否則從站點上重新獲取資料。我們設定了快取大小為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的記憶體快取機制,下一篇文章將重點介紹一下本地快取機制。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2808393/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS 除SDWebImage之外清理記憶體中快取iOSWeb記憶體快取
- CPU快取記憶體快取記憶體
- Oracle Exadata與SGA快取記憶體CQOracle快取記憶體
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- 記憶體快取選型記憶體快取
- 快取記憶體一致性協議MESI與記憶體屏障快取記憶體協議
- CPU快取和記憶體屏障快取記憶體
- docker部署redis快取記憶體DockerRedis快取記憶體
- 談談CPU快取記憶體快取記憶體
- django 快取表格到記憶體Django快取記憶體
- 【軟體開發底層知識修煉】四 深入淺出處理器之四 結合快取記憶體以及TLB與虛擬記憶體快取記憶體
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- iOS開發-屬性的記憶體管理iOS記憶體
- MRAM快取記憶體的組成快取記憶體
- 高效能記憶體快取 ristretto記憶體快取
- ASP.NET Core - 快取之記憶體快取(下)ASP.NET快取記憶體
- ASP.NET Core - 快取之記憶體快取(上)ASP.NET快取記憶體
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取
- 建立快取記憶體機制-java版快取記憶體Java
- 高併發、低延遲之玩轉CPU快取記憶體(附C#示例)快取記憶體C#
- iOS記憶體深入探索之VM TrackeriOS記憶體
- 淺談快取寫法(三):記憶體快取該如何設計快取記憶體
- TMCache原始碼分析(一)—TMMemoryCache記憶體快取原始碼記憶體快取
- TMCache原始碼分析(一)---TMMemoryCache記憶體快取原始碼記憶體快取
- 快取及使用 Circuit Breaker 限制記憶體使用快取UI記憶體
- laravel redirect快閃記憶體blade讀取不到Laravel記憶體
- Spring Boot整合Hazelcast實現叢集與分散式記憶體快取Spring BootAST分散式記憶體快取
- 【雜談】快取記憶體一致性與可見性快取記憶體
- 讀懂作業系統之虛擬記憶體TLB與快取(cache)關係篇(四)作業系統記憶體快取
- iOS 記憶體管理iOS記憶體
- iOS開發筆記— 資料庫、Crash、記憶體問題分析iOS筆記資料庫記憶體
- 直接記憶體和堆記憶體誰快記憶體
- iOS底層原理(一):OC物件實際佔用記憶體與開闢記憶體關係iOS物件記憶體
- Android 記憶體快取框架 LruCache 的原始碼分析Android記憶體快取框架原始碼
- Linux系統手動釋放記憶體快取Linux記憶體快取
- 鐵威馬NAS如何使用SSD快取記憶體?快取記憶體
- java 記憶體模型-03-快取和重排序Java記憶體模型快取排序
- iOS 記憶體管理MRCiOS記憶體