NSCachedURLResponse willCacheResponse не вызывается
Мы настроили простой 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 ответ
Какао применяет всевозможные критерии, чтобы определить, может ли он кэшироваться. Например, по моему опыту, вы не увидите willCacheResponse
Вызывается, если размер ответа превышает примерно 5% от размера кэша постоянного хранилища. Я также видел, как другие утверждают, что если max-age
меньше чем 1835400
, он также не будет кэшироваться (это не мой опыт, но, возможно, пострадали более старые версии iOS). Очевидно, что запрос должен быть http
или же https
просьба, не ftp
или же file
запрос.
Если мой кэш достаточно большой (и мой ответ правильно Cache-Control
а также Content-Type
Я нахожу, что кеш работает нормально. Я только хотел бы, чтобы Apple четко сформулировала применяемые критерии (либо в документации, либо в кодах возврата), поскольку я и другие тратили часы на диагностику сбоев кэша только для того, чтобы понять, что Какао применяет некоторые секретные правила.
Обратите внимание, если NSURLConnection
сам был удовлетворен, извлекая его из кеша, willCacheResponse
не будет называться. И, конечно же, убедитесь, что didFailWithError
не был назван.