NSURLConnection использует NSURLCache?

Я пытаюсь понять, как использовать платформу загрузки URL-адресов для загрузки URL-адресов, использующих кеширование.

Я использую NSURLConnections и кормя их NSURLRequests. Я даже установил cachePolicy для этих запросов в NSURLRequestReturnCacheDataElseLoad. В первый раз, когда я загружаю запрос, он автоматически попадает в кеш ([NSURLCache sharedCache] имеет его). Но в следующий раз, когда я загружаю тот же запрос, NSURLConnection, похоже, игнорирует то, что в кеше и перезагружает данные.

Предполагаю ли я вручную внедрять поиск кеша и возвращать кэшированные данные? Неужели NSURLConnection не делает этого? Или есть какой-то способ заставить инфраструктуру использовать кеш без проблем?

ОБНОВЛЕНИЕ: Пробовал следующее без успеха:

  • Настройка политики кэша запросов на NSURLRequestReturnCacheDataElseLoad вместо NSURLRequestUseProtocolCachePolicy
  • Повторное использование объекта запроса вместо создания нового
  • Использование +[NSURLConnection sendSynchronousRequest:returningResponse:error:] вместо загрузки асинхронно

Ответ 1

ПРИМЕЧАНИЕ iOS 5 предоставляет общий доступ кURLCache, который имеет и память и емкость диска.

Ничего не будет кэшировать, если вы не установили NSURLCache в некоторая емкость:

// A 10MB cache. This a good avatar-image-cache size but might be too 
// large for your app memory requirements. YMMV.
[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];

Экземпляр iPhone NSURLCache по умолчанию отказывается от кэширования на диск. если вам нужно это поведение, вы должны подклассом NSURLCache и реализовать свой собственный кеш диска. Я нашел множество примеров дисковых кэшей на GitHub, хотя ни один из них не делает полностью необходимый "чернослив" шаг удовлетворительно IMHO.

Ответ 2

Он действительно будет использовать NSURLCache автоматически, по крайней мере в некоторых случаях. Конечно, это делается в следующем коде:

EDIT - работает в приложении OS X 10.6 Cocoa, а не в iPhone (неверный вопрос)

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

    // run request with default cache policy
 NSMutableURLRequest *req=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/"]];
 NSData *data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
 NSLog(@"Received %d bytes", [data length]);

 sleep(10);

    // now run it asking it to use the cache
 [req setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
 data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
 NSLog(@"Received %d bytes", [data length]);

    return 0;
}

Ответ 3

Вы пытались возиться с методом connection:willCacheResponse:? Согласно документации по загрузке URL-адресов, "По умолчанию данные для подключения кэшируются в соответствии с поддержкой, предоставляемой подклассом NSURLProtocol, который обрабатывает запрос. NSURLConnection Delegationdelegate может дополнительно уточнить это поведение путем реализации соединения: willCacheResponse:."