你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS開發(99)之內存緩存

IOS開發(99)之內存緩存

編輯: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類似。
6NSURLRequestReloadRevalidatingCacheData:驗證本地數據與遠程數據是否相同,如果不同則下載遠程數據,否則使用本地數據。

NSURLCache還提供了很多方法,來方便我們實現應用程序的緩存機制。下面我通過一個例子來說明,這個例子減少我們對同一個url多次請求。看下面代碼:

[plain]
-(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。

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

[plain]
- (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(@"請求失敗");   
 
}  

 第一次點擊按鈕的結果:


2013-05-21 16:26:18.959 CacheDataTest[2838:c07]即將發送請求

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]將接收輸出

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]接受數據

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]數據長度為 = 2896

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]接受數據

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]數據長度為 = 4344

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]接受數據

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]數據長度為 = 1448

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]接受數據

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]數據長度為 = 1749

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]將緩存輸出

2013-05-21 16:26:19.037 CacheDataTest[2838:c07] ADDRESPONSE - ADDING TO MEMORY ONLY: http://www.baidu.com/

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]請求完成

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


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] 請求完成

我們看到沒有“將緩存輸出”一項的內容,請求到的數據是第一次請求的累積,也就是第二次是從內存中獲取數據的。

 


 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved