NSURLCache缓存响应问题

时间:2010-02-25 22:30:28

标签: iphone iphone-sdk-3.0 nsurlcache

我正在编写一个iPhone应用程序,其中一个标签是一个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];

我可以看到NSLog第一次输出“没有得到回复”,因为它是第一次访问这个网站(http://www.twitter.com/..。) 我还可以看到响应正在被缓存,因为我实现了在启动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;
}

我第二次访问这个网站时,我可以清楚地看到NSLog输出“Got Response”,这意味着有一个缓存命中,因此willCacheResponse应该再次被调用,但是由于一些奇怪的原因它被一次又一次地调用,并且不会将信息从缓存中拉出来,而是尝试再次缓存它。

知道是什么导致了这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

OP可能不再关心了,但对于其他玩这个的人 - 你应该看看响应中返回的HTTP头。 NSURLCache将检查标头以确定它是否可以使用从缓存返回的内容。 Cache-Control:Last-Modified:Etag:etc。

答案 1 :(得分:2)

请尝试使用此库:https://github.com/rs/SDURLCache

答案 2 :(得分:0)

如果我正确理解你的问题,那么我遇到了同样的问题并且从未解决过: Does NSURLConnection take advantage of NSURLCache?

据我所知,NSURLConnection并没有利用缓存,如果你需要,你必须自己动手。