天天看點

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類似。

6NSURLRequestReloadRevalidatingCacheData:驗證本地資料與遠端資料是否相同,如果不同則下載下傳遠端資料,否則使用本地資料。

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的記憶體緩存機制,下一篇文章将重點介紹一下本地緩存機制