3

私は iPhone アプリケーションを作成しています。そのタブの 1 つは Twitter フィードです。Twitter xml を解析して、テーブル ビュー内に適切に配置しています。インターネット接続がない場合は、最後にインターネット接続があり、テーブルが更新されたときのキャッシュ結果を表示したいと思います。私はそのために NSURLCache を使用しています:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink]
        cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
NSURLCache *sharedCache = [NSURLCache sharedURLCache];

NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest];

if (response) {
   NSLog(@"Got Response");
} else {
   NSLog(@"Didn't got Response");  
}
 self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease];

この Web サイト ( http://www.twitter.com/.. ) に初めてアクセスしたので、初めて NSLog が「応答がありませんでした」を出力することがわかります。また、応答がキャッシュされていることもわかります。 initWithRequest が起動された後に呼び出される willCacheResponse メソッドを実装したため、次のようになります。

 - (NSCachedURLResponse *) connection:(NSURLConnection *)connection 
   willCacheResponse:(NSCachedURLResponse *)cachedResponse
 {
    NSLog(@"willCache Reponse"); 
    NSCachedURLResponse *newCachedResponse = nil;    
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) {
            newCachedResponse = [[[NSCachedURLResponse alloc]
            initWithResponse:[cachedResponse response]
            data:[cachedResponse data]
            userInfo:nil
            storagePolicy:[cachedResponse storagePolicy]]
            autorelease];
 }
     return newCachedResponse;
}

このサイトに 2 回目にアクセスすると、NSLog が "Got Response" を出力することがはっきりとわかります。これは、キャッシュ ヒットがあったことを意味します。キャッシュから情報を取り出し、代わりに再度キャッシュしようとします。

この問題の原因は何ですか?

ありがとう!

4

3 に答える 3

2

このライブラリを試してください:https ://github.com/rs/SDURLCache

于 2011-07-19T05:26:37.387 に答える
2

OPはおそらくもう気にしませんが、これで遊んでいる人にとっては、応答で返されるHTTPヘッダーを確認する必要があります。NSURLCache はヘッダーをチェックして、キャッシュから返されたものを使用できるかどうかを判断します。Cache-Control: Last-Modified: Etag: など。

于 2011-07-15T17:34:40.910 に答える
0

あなたの質問を正しく理解していれば、同じ問題があり、解決できませんでした: NSURLConnection は NSURLCache を利用しますか?

私が知る限り、NSURLConnection はキャッシュを利用しないだけであり、必要に応じて自分で行う必要があります。

于 2010-02-27T06:29:34.553 に答える