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:."