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 не был назван.

Другие вопросы по тегам