NSURLConnection на iOS не пытается кэшировать объекты размером более 50 КБ - PullRequest
9 голосов
/ 23 августа 2011

Несмотря на документацию Apple , в которой указано иное , NSURLCache на iOS вообще не выполняет никакого кэширования диска (флэш). Вы можете создать подкласс NSURLCache, чтобы изменить поведение операций выборки и сохранения для использования диска (как это делает SDURLCache), но из-за следующих серьезных ограничений того, как кэш используется и реализован, это не работает так, как вы ожидаете:

  • NSURLConnection даже не вызывает storeCachedResponse:forRequest: для файлов размером более 50 КБ (> = 52428 байт, если быть точным). Это делает подкласс NSURLCache бессмысленным для нашего использования (изображения размером 200 КБ), потому что он даже не попадет в кеш. В результате мы должны добавить кеширование вручную на уровне выше NSURLConnection.
  • Даже когда кто-то вызывает встроенный NSURLCache storeCachedResponse:forRequest: вручную, он сохраняет ответ в памяти, только если он меньше 180 КБ. Я проверил это, вызвав storeCachedResponse вручную и убедившись, что значение до / после currentMemoryUsage не изменилось при длине данных более 180 КБ. Таким образом, мы также должны написать собственное кэширование памяти LRU.

Кто-нибудь еще заметил эти проблемы? Или мне чего-то не хватает?

К вашему сведению, я использую iOS 4.3 в симуляторе и на iPad 2.

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Я бы предложил использовать библиотеку ASIHTTPRequest вместо NSURLRequest:

http://allseeing -i.com / ASIHTTPRequest / How-to-use

ИмеетНадежный API для кэширования:

http://allseeing -i.com / ASIHTTPRequest / Как использовать # using_a_download_cache

2 голосов
/ 25 января 2013

Я не уверен, как это работает для UIWebvieuw, но когда вы используете NSURLRequest, максимальный размер файла зависит от того, как вы инициализируете URLCache (initWithMemoryCapacity: (NSUInteger) memoryCapacity ...)

1 голос
/ 29 августа 2011

Я бы предложил использовать библиотеку three20 и TTURLRequest.Похоже, что это имеет хорошее кэширование для больших размеров данных, так как оно используется для Facebook и, в частности, для изображений.

TTURLRequest - это капля замены NSURLRequest, поэтому его легко переместить на и нет.не сильно зависит от остальной части Three20

0 голосов
/ 13 сентября 2011

Проверьте мой ответвление AFNetworking, которое включает в себя пользовательский класс NSURLCache, который поддерживает сохранение диска: https://github.com/steipete/AFNetworking/tree/disk-cache

...