Как кэшировать изображения?

Что такое кэширование, зачем и как его использовать с веб студией НадоСайт.

Кэширование — отличный способ повысить производительность приложений и удобство работы с конечным пользователем. Некоторые популярные библиотеки iOS пытаются заново изобрести кэширование, особенно когда речь идет о хранении изображений. Они часто пропускают HTTP-кеш в системе загрузки URL-адресов Foundation .

Почему HTTP кеш? Это отраслевой стандарт, который соответствует потребностям большинства пользователей. HTTP предоставляет все виды инструментов для кэширования, и есть вероятность, что ваш сервер уже поддерживает его.

В дополнение к кешу на диске необходимо иметь отдельный кеш в памяти для быстрого доступа к распакованным изображениям, которые готовы к отображению.

TL; DR 

  • Каждый ресурс может определять свою политику кэширования через заголовки кеша HTTP.
  • HTTP-кеш поддерживает истечение срока действия и проверку кэшированных ответов
  • Агрессивное кэширование является наиболее жизнеспособной стратегией для статических изображений, проверка полезна для изображений профиля и т. Д.
  • Система загрузки URL-адресов Foundation поддерживает HTTP-кэширование
  • Есть несколько способов настроить управление кэшем системы загрузки URL (NSURLRequestCachePolicy и т. Д.)
  • NSCache можно использовать для кэширования в памяти, для этого требуется правильная настройка (общий лимит затрат, стоимость на объект)

HTTP кэширование 

Есть несколько аспектов HTTP, связанных с кэшированием. Чтобы включить HTTP-кэширование, сервер должен прикреплять соответствующие заголовки кеша к каждому ответу, указывая желаемое поведение кеша.

HTTP-кэш довольно гибкий. Это позволяет серверам:

  • Установить ограничения на то, какие ответы кэшируются
  • Установите срок действия ответов, используя max-age(часть составного заголовка Cache-Control ) и / илиExpires
  • Предоставьте валидаторы ( ETag, Last-Modified), которые используются для проверки устаревших ответов с сервером
  • Принудительная повторная проверка по каждому запросу

Большинство изображений являются статическими ресурсами, которые не изменятся в будущем. Наиболее жизнеспособная стратегия кэширования в этом случае — агрессивное кэширование. Сервер должен просто установить Cache-Controlзаголовок со max-ageзначением года в будущем со времени запроса. Рекомендуется Expiresустановить аналогичное значение.

Cache-Control:public; max-age=31536000

Expires: Mon, 25 Jan 2017 17:45:57 GMT.

Кэширование в системе загрузки URL-адресов Foundation 

Платформа Foundation предоставляет набор классов для связи с серверами с использованием стандартных интернет-протоколов, включая HTTP. Также реализовано управление кешем:

  • Имеет составной кэш на диске и в памяти
  • Хип кеш контроль
  • Он обрабатывает повторную проверку прозрачно, вам никогда не придется иметь дело с кодом состояния 304 (не изменен)

На стороне клиента не требуется никаких дополнительных настроек для управления кэшем. Однако есть некоторые вещи, которые вы можете сделать, чтобы система работала так, как вы ожидаете.

Согласно документации Apple , ответы кэшируются только тогда, когда выполняются все следующие условия:

  • Запрос для HTTP или HTTPS URL (или ваш собственный сетевой протокол, который поддерживает кэширование).
  • Запрос был успешным (с кодом состояния в диапазоне 200–299).
  • Предоставленный ответ пришел с сервера, а не из кэша.
  • Политика кэширования конфигурации сеанса допускает кэширование.
  • Политика NSURLRequestкэширования указанного объекта (если применимо) разрешает кэширование.
  • Заголовки, связанные с кэшем в ответе сервера (если есть), разрешают кэширование.
  • Размер ответа достаточно мал, чтобы вписаться в кеш. (Например, если вы предоставляете кеш диска, ответ должен быть не больше, чем примерно 5% от размера кеша диска.)

Ваше приложение должно уже соответствовать большинству из них по умолчанию (например, конфигурация сеанса позволяет кэшировать по умолчанию). Однако одна вещь, которую клиент обязательно должен сделать, это установить соответствующий размер кэша.

Настройка кэширования 

Давайте немного углубимся в систему загрузки URL и посмотрим, какие ее части мы можем использовать для изменения поведения кэширования.

NSURLCache 

Одним из классов в этой системе является NSURLCache, который является частью управления кешем. Он обеспечивает составной кэш в памяти и на диске. Он предоставляет методы для настройки размера кэша и его расположения на диске. У него также есть методы для управления NSCachedURLResponseобъектами, которые содержат кэшированные ответы. Этот класс сам по себе не так полезен, но важно, как он вписывается во всю систему.

NSURLSession 

Основным интерфейсом для системы загрузки URL является NSURLSession . Это огромное улучшение по сравнению NSURLConnectionс iOS 9. Некоторые из этих улучшений применимы и к кешированию. NSURLSessionдает вам возможность предоставлять кеширование для каждой сессии ( NSURLCache), политику кэширования ( NSURLRequestCachePolicy) и устанавливать другие параметры.

Давайте сосредоточимся на NSURLRequestCachePolicy, который является основным способом изменения поведения кэширования. Политика кэширования может быть установлена ​​как per NSURLRequest, так и per NSURLSession. По умолчанию используется значение, .UseProtocolCachePolicy описанное в примере в разделе «HTTP-кэширование». Некоторые из других наиболее полезных политик:

  • .ReturnCacheDataDontLoad- должны использоваться существующие данные кэша, независимо от его возраста или срока годности. Если в кеше нет данных, попытка загрузки данных не предпринимается. Эта политика может быть полезна, когда ваше приложение находится в «автономном» режиме, и вы хотите показывать устаревшие изображения без проверки их на сервере.
  • .ReturnCacheDataElseLoad- аналогично предыдущей политике, но позволяет клиенту загружать данные с сервера. Иногда удобно установить это свойство по умолчанию, чтобы включить агрессивное кэширование, не беспокоясь о «автономном» режиме. Обратите внимание, что эта политика эффективно отключает проверку кэша.
  • .ReloadIgnoringCacheData- всегда загружать данные с сервера. Эта опция предотвращает использование данных кэша, вы не можете использовать их для принудительной проверки.

NSURLSessionтакже предоставляет полный набор методов делегатов. Одним из таких методов является URLSessionSession (_: dataTask: willCacheResponse: завершениеHandler :), из NSURLSessionDataDelegate которого. Он может быть использован для предотвращения кэширования определенных URL-адресов, предоставления настраиваемых userInfoответов для кэширования и многого другого. Обратите внимание, что этот метод вызывается, только если NSURLSessionрешает кэшировать ответ. Вы не можете использовать его для принудительного NSURLSessionкэширования ответов, заголовки которых явно отключают кэширование.

Еще одна замечательная особенность NSURLSession заключается в том, что он имеет свой собственный способ ограничения числа одновременных подключений через HTTPMaximumConnectionsPerHost свойство NSURLSessionConfiguration. Он ограничивает только количество HTTP-соединений, а не количество одновременных сеансовых задач ( NSURLSessionTask). Учитывая, что, если клиент запускает новый запрос, который может быть обработан свежим кэшированным ответом, он будет обработан немедленно, независимо от того, сколько других задач выполняется в данный момент.

Наши работы

Контакты