不会调用NSCachedURLResponse willCacheResponse

时间:2013-11-29 17:09:49

标签: ios nsurlconnection nsurlcache

我们根据下面的缩写代码片段设置了一个简单的NSURLConnection和NSURLCache。我们已经确定服务器(localhost:9615)返回以下缓存头:

ETag : abcdefgh
Cache-Control : public, max-age=60

但是,永远不会调用willCacheResponse委托方法。有什么想法吗?

代码:

// In the app delegate
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

// Triggered by a UIButton
- (IBAction)sendRequest:(UIButton *)sender {
    NSLog(@"sendRequest");
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:9615"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];
    NSMutableData *receivedData = [NSMutableData dataWithCapacity: 0];
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (!theConnection) {
        receivedData = nil;
    }
}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    NSLog(@"willCacheResponse");
    // ...
}

1 个答案:

答案 0 :(得分:9)

Cocoa应用各种标准来确定它是否可以缓存。例如,根据我的经验,如果响应的大小超过持久存储高速缓存大小的大约5%,则不会看到willCacheResponse被调用。我还看到其他人声称,如果max-age小于1835400,它也不会缓存(这不是我的经验,但可能是旧iOS版本受此影响)。显然,请求必须是httphttps请求,而不是ftpfile请求。

如果我的缓存足够大(并且我的响应正确提供Cache-ControlContent-Type),我发现缓存正常工作。我只希望Apple明确表达所应用的标准(在文档或返回代码中),因为我和其他人浪费了几个小时诊断缓存失败只是为了意识到Cocoa正在应用一些秘密规则。

注意,如果NSURLConnection本身通过从缓存中检索来满足,则不会调用willCacheResponse。当然,确保没有调用didFailWithError