3

我正在编写一个 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,但由于某种奇怪的原因,它被一次又一次调用并且不拉缓存中的信息,而是尝试再次缓存它。

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

谢谢!

4

3 回答 3

2

OP 可能不再关心,但对于其他玩这个的人 - 你应该查看响应中返回的 HTTP 标头。NSURLCache 将检查标头以确定它是否可以使用从缓存返回的内容。缓存控制:上次修改:Etag:等。

于 2011-07-15T17:34:40.910 回答
2

请试试这个库:https ://github.com/rs/SDURLCache

于 2011-07-19T05:26:37.387 回答
0

如果我正确理解了您的问题,那么我遇到了同样的问题并且从未解决过: NSURLConnection 是否利用了 NSURLCache?

据我所知, NSURLConnection 只是没有利用缓存,如果你想要的话,你必须自己做。

于 2010-02-27T06:29:34.553 回答