iOS開發之記憶體緩衝機制

來源:互聯網
上載者:User

使用緩衝的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的運行。有時候我們需要將遠程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多次請求。看下面代碼:

 
  1. -(IBAction) buttonPress:(id) sender  
  2. {  
  3.     NSString *paramURLAsString= @"http://www.baidu.com/";  
  4.     if ([paramURLAsString length] == 0){  
  5.         NSLog(@"Nil or empty URL is given");  
  6.         return;  
  7.     }  
  8.     NSURLCache *urlCache = [NSURLCache sharedURLCache];  
  9.     /* 設定緩衝的大小為1M*/ 
  10.     [urlCache setMemoryCapacity:1*1024*1024];  
  11.      //建立一個nsurl  
  12.     NSURL *url = [NSURL URLWithString:paramURLAsString];  
  13.         //建立一個請求  
  14.     NSMutableURLRequest *request =  
  15.     [NSMutableURLRequest 
  16.      requestWithURL:url  
  17.      cachePolicy:NSURLRequestUseProtocolCachePolicy 
  18.      timeoutInterval:60.0f];  
  19.      //從請求中擷取緩衝輸出  
  20.     NSCachedURLResponse *response =  
  21.     [urlCache cachedResponseForRequest:request];  
  22.     //判斷是否有緩衝  
  23.     if (response != nil){  
  24.         NSLog(@"如果有緩衝輸出,從緩衝中擷取資料");  
  25.         [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];  
  26.     }  
  27.     self.connection = nil;  
  28.     /* 建立NSURLConnection*/ 
  29.     NSURLConnection *newConnection =  
  30.     [[NSURLConnection alloc] initWithRequest:request  
  31.                                     delegate:self 
  32.                             startImmediately:YES];  
  33.     self.connection = newConnection;  
  34.     [newConnection release];  

這個例子中,我們請求url為www.baidu.com的網站。如果這個url被緩衝了,我們直接從緩衝中擷取資料,否則從www.baidu.com網站上重新擷取資料。我們設定了緩衝大小為1M。

使用下面代碼,我將請求的過程列印出來:

 
  1. - (void)  connection:(NSURLConnection *)connection     
  2.   didReceiveResponse:(NSURLResponse *)response{     
  3.     NSLog(@"將接收輸出");     
  4. }     
  5. - (NSURLRequest *)connection:(NSURLConnection *)connection     
  6.              willSendRequest:(NSURLRequest *)request     
  7.             redirectResponse:(NSURLResponse *)redirectResponse{     
  8.     NSLog(@"即將發送請求");     
  9.     return(request);     
  10. }     
  11. - (void)connection:(NSURLConnection *)connection     
  12.     didReceiveData:(NSData *)data{     
  13.     NSLog(@"接受資料");     
  14.     NSLog(@"資料長度為 = %lu", (unsigned long)[data length]);     
  15. }     
  16. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection     
  17.                   willCacheResponse:(NSCachedURLResponse *)cachedResponse{     
  18.     NSLog(@"將緩衝輸出");     
  19.     return(cachedResponse);     
  20. }     
  21. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{     
  22.     NSLog(@"請求完成");     
  23. }     
  24. - (void)connection:(NSURLConnection *)connection     
  25.   didFailWithError:(NSError *)error{     
  26.     NSLog(@"請求失敗");     
  27. }    

當我們第一次點擊介面上的按鈕,列印的結果如下:

 
  1. 2011-07-30 18:50:24.910 Caching[3971:207] 即將發送請求     
  2. 2011-07-30 18:50:28.557 Caching[3971:207] 將接收輸出     
  3. 2011-07-30 18:50:31.677 Caching[3971:207] 接受資料     
  4. 2011-07-30 18:50:31.681 Caching[3971:207] 資料長度為 = 4414     
  5. 2011-07-30 18:50:31.682 Caching[3971:207] 接受資料     
  6. 2011-07-30 18:50:31.682 Caching[3971:207] 資料長度為 = 2996     
  7. 2011-07-30 18:50:38.107 Caching[3971:207] 將緩衝輸出     
  8. 2011-07-30 18:50:38.109 Caching[3971:207] 請求完成    

在看我們第二次點擊介面上的按鈕,列印結果如下:

 
  1. 2011-07-30 18:52:18.894 Caching[3971:207] 即將發送請求 
  2. 2011-07-30 18:52:18.895 Caching[3971:207] 將接收輸出 
  3. 2011-07-30 18:52:18.895 Caching[3971:207] 接受資料 
  4. 2011-07-30 18:52:18.896 Caching[3971:207] 資料長度為 = 7410 
  5. 2011-07-30 18:52:18.896 Caching[3971:207] 請求完成 

我們看到沒有“將緩衝輸出”一項,請求到的資料是第一次請求的累積,也就是第二次是從記憶體中擷取資料的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.