Только кеш URLSession - PullRequest
       14

Только кеш URLSession

0 голосов
/ 21 ноября 2018

Иногда я хочу получать данные из кеша только при использовании URLSession.Например, при быстрой прокрутке в UITableView я хотел бы показать изображения, которые уже находятся в кэше, но не запускают никаких HTTP-запросов.Изображения - это просто пример. Может быть, что угодно.

Так что в настоящее время я изучаю CachePolicy URLSession, но он не поддерживает возможность получать только действительные (не просроченные и т. Д.) Данные из кэша.

Я могу посмотреть на URLCache самостоятельно, но это также, конечно, возвращает данные, срок действия которых может истечь.Есть ли какой-нибудь API, который может проверять CachedURLResponse?Потому что тогда я могу сделать это сам.Или я должен сам выполнить проверку.

1 Ответ

0 голосов
/ 02 декабря 2018

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

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

При этомесли вы действительно хотите такое поведение, есть два способа сделать это:

  • Использовать NSURLRequestReturnCacheDataDontLoad и самостоятельно проверить возраст кэшированного ответа.
  • Выполнить запрос внастраиваемый сеанс, используйте NSURLRequestUseProtocolCachePolicy, и в этом сеансе установите настраиваемый подкласс NSURLProtocol, который переопределяет initWithTask:cachedResponse:client: и startLoading и вызывает URLProtocol:didFailWithError: на указанном клиенте в начале его метода startLoading.

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

...