iOS開発のキャッシュ:メモリキャッシュ

6458 ワード

キャッシュを使用する目的は、使用するアプリケーションがユーザーの入力に迅速に応答できるようにするためであり、プログラムの効率的な実行です.リモートWebサーバで取得したデータをキャッシュし、同じurlへの複数回のリクエストを減らす必要がある場合があります.
メモリキャッシュはsdkのNSURLCacheクラスを使用できます.NSURLRequestでは、要求されたurlがデータをキャッシュする方法を説明するキャッシュパラメータが必要です.まず、CachePolicyタイプを見てみましょう.
1、NSURLRequestUseProtocolCachePolicy NSURLRequestデフォルトのcache policy、Protocolプロトコル定義を使用します.2、NSURL RequestReloadIgnoringCacheDataキャッシュを無視して元のアドレスから直接ダウンロードする.3、NSURLRequestReturnCacheDataElseLoadは、cacheにdataが存在しない場合にのみ元のアドレスからダウンロードされます.4、NSURLRequestReturnCacheDataDontLoadはcacheデータのみを使用し、cacheが存在しない場合、要求は失敗する.ネットワーク接続オフラインモードが確立されていない場合に使用されます.5、N S R u r L R e q u s t R o l a d I g n o r i ngLocalAndRemoteCacheData:ローカルおよびリモートのキャッシュデータを無視し、元のアドレスから直接ダウンロードし、NSURL R e q u s t R o l o adIgnoringCacheDataと類似する.6 NSURLRequestReloadRevalidatingCacheData:ローカルデータとリモートデータが同じかどうかを確認し、異なる場合はリモートデータをダウンロードします.そうでない場合はローカルデータを使用します.
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サイトからデータを再取得します.キャッシュサイズを1 Mに設定しました.
次のコードを使用して、要求されたプロセスを印刷します.
- (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] 2回目の画面のボタンをクリックすると、次のように印刷されます.
? 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] 「キャッシュを出力する」という項目はありません.要求されたデータは、最初の要求の累積、つまり2回目はメモリからデータを取得します.