IOS開發緩存機制之—內存緩存機制

 

使用緩存的目的是爲了使用的應用程序能更快速的響應用戶輸入,是程序高效的運行。有時候咱們須要將遠程web服務器獲取的數據緩存起來,減小對同一個url屢次請求。web

內存緩存咱們能夠使用sdk中的NSURLCache類。NSURLRequest須要一個緩存參數來講明它請求的url何如緩存數據的,咱們先看下它的CachePolicy類型。緩存

一、NSURLRequestUseProtocolCachePolicy NSURLRequest默認的cache policy,使用Protocol協議定義。
二、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
三、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載。
四、NSURLRequestReturnCacheDataDontLoad 只使用cache數據,若是不存在cache,請求失敗;用於沒有創建網絡鏈接離線模式;
五、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠程的緩存數據,直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData相似。
六、NSURLRequestReloadRevalidatingCacheData:驗證本地數據與遠程數據是否相同,若是不一樣則下載遠程數據,不然使用本地數據。服務器

NSURLCache還提供了不少方法,來方便咱們實現應用程序的緩存機制。下面我經過一個例子來講明,這個例子減小咱們對同一個url屢次請求。看下面代碼:網絡

-(IBAction) buttonPress:(id) sender ide

網站

    NSString *paramURLAsString= @"http://www.baidu.com/"; url

    if ([paramURLAsString length] == 0){ 內存

        NSLog(@"Nil or empty URL is given"); ci

        return; web服務器

    } 

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

}

相關文章
相關標籤/搜索