NSURLCache для фоновых задач NSURLSession

Я пытаюсь реализовать кеширование в своем приложении, я использую NSURLSession с фоновой конфигурацией для большинства моих сетевых потребностей, и он отлично работает, но затем я добавляю объект кеша, который сеанс игнорирует и всегда идет на сервер

Я попытался использовать экземпляр сеанса по умолчанию с кешем, и система использует кеш

Я читал документацию несколько раз, но там нет упоминания об игнорировании объекта кеша для фоновых задач.

Кто-нибудь знает, это баг или что-то в этом роде


person Arkadi    schedule 16.02.2016    source источник


Ответы (2)


Фоновые сеансы поддерживают только задачи загрузки и выгрузки, но не задачи данных. И только задачи с данными используют кеш. Таким образом, фоновому сеансу нет необходимости проверять кеш.

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

Для получения дополнительной информации см. документацию для NSURLCache.

person dgatwood    schedule 24.09.2016

Вау, я давно задавал этот вопрос, а ответа до сих пор нет.

Сказать по правде, в итоге я использовал токен DTS для этого.

Оказывается, фоновая конфигурация NSURLSession вообще не поддерживает кеширование, независимо от того, какую задачу вы используете.

Это дизайнерское решение Apple, которое плохо задокументировано.

Вот часть повтора DTS, который я получил:

Я отвечаю на ваш вопрос о взаимосвязи между фоновыми сеансами NSURLSession и NSURLCache. Вы написали:

Затем я добавляю объект NSURLCache в свою конфигурацию, механизм NSURLSession полностью игнорирует его.

Конечно. Это ожидаемое поведение, так как в настоящее время обстоят дела с фоновыми сеансами NSURLSession /never/cache. На это есть куча причин:

  • Невозможно полностью поддерживать свойство URLCache. В частности, мы не можем позволить вам использовать пользовательский подкласс NSURLCache, потому что это потребует от нас загрузки вашего кода в системный демон (помните, что фактическая работа здесь выполняется демоном NSURLSession, пока ваше приложение приостановлено, или, возможно, даже прекращено).

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

  • Здесь философский разрыв. Фоновые сеансы NSURLSession предназначались для небольшого количества больших передач, тогда как NSURLCache действительно полезен только тогда, когда вы выполняете большое количество небольших передач.

Примечание. Запуск большого количества небольших передач через фоновый сеанс NSURLSession может вызвать проблемы по другим причинам. Для получения дополнительной информации об этом прочитайте следующие сообщения DevForums:

  • Ограничитель скорости возобновления сеанса NSURLSession

https://forums.developer.apple.com/message/42352#42352

  • Переход к меньшему количеству крупных переводов

https://forums.developer.apple.com/thread/14853

Если вы хотите, чтобы инженеры NSURLSession пересмотрели это решение по проектированию кэширования, вы можете свободно отправить сообщение об ошибке с просьбой о его поддержке. Обязательно подробно объясните свой вариант использования.

https://developer.apple.com/bug-reporting/

Ваша ошибка может быть возвращена как «ведет себя правильно», но спросить не помешает.

Что касается ошибок, я полагаю, вы просматривали документацию по NSURLSession и не нашли задокументированного этого подводного камня. Если это так, я был бы признателен вам за сообщение об ошибке в документации, которую вы просматривали, с просьбой включить в нее информацию об этой проблеме.

person Arkadi    schedule 26.07.2018