2010-02-25 143 views
3

我正在写一个iPhone应用程序,它的一个选项卡是一个Twitter供稿,我正在解析twitter xml并将其很好地放在表视图中。 如果没有互联网连接,我想显示最后一次互联网连接和表更新的缓存结果。 我使用NSURLCache对于像这样: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输出“得到的回应“这意味着有一个缓存命中,因此willCacheResponse s应该再次调用而不是,但出于某种奇怪的原因,它被一次又一次地调用,并且不会将信息从缓存中取出,而是尝试再次缓存它。

任何想法是什么导致此问题?

谢谢!

+0

我尝试了所有类型的政策。 基本上我需要使用NSURLRequestUseProtocolCachePolicy,总是从远程加载如果有互联网连接,否则从缓存中加载,但两者都给我同样的问题。 – djTeller 2010-02-25 23:17:59

回答

0

如果我正确理解你的问题,然后我有同样的问题,从来没有解决它: Does NSURLConnection take advantage of NSURLCache?

据我所知,NSURLConnection的只是不走高速缓存的优势,你必须如果你想要的话,自己动手吧。

+0

这正是我的问题,好像它只缓存响应URL而不是它的数据,所以万一我想使用它,我可以验证我已经访问了一个特定的网站。 我实际上昨天整天使用NSKeyedArchive实现缓存,我在开始时使用NSURLCache,只是作为缓存该网站的指示,如果响应是否,我缓存它,如果响应是肯定的,我将它从档案。 他们应该使这个主题的文档更清晰一些,并且还要添加一些例子。 – djTeller 2010-02-27 14:12:52

2

OP可能不在乎任何东西,但对于其他人玩这个 - 你应该看看在响应中返回的HTTP头。 NSURLCache将检查标题以决定它是否可以使用从缓存中返回的东西。的Cache-Control:上次修改:Etag的:等