Я уже спрашивал когда именно все становится удалить из памяти и диска urlcache?
Теперь у меня есть еще несколько уточняющих вопросов:
Кэш памяти ограничен оперативной памятью iPhone (обычно 2 Гб). А вот дисковое Persistence ограничено 64Gb или 128Gb. Это правильно?
Есть ли смысл иметь постоянство больше, чем ваша память. Может ли это быть полезно, если вы не хотите иметь большой объем памяти (и не хотите, чтобы приложение было завершено из его приостановленного состояния), т.е. разрешить восстановление кеша из дискового хранилища, а затем вернуть сохраненные результаты?
После контрольного нажатия на URLCache.shared
вижу следующие комментарии:
- Объем памяти: 4 мегабайта (4*1024*1024 байта)
- Емкость диска: 20 мегабайт (20*1024*1024 байт)
- Путь к диску:
(user home directory)/Library/Caches/(application bundle id)
Пользователи, не предъявляющие особых требований или ограничений к кэшированию, должны найти экземпляр общего кэша по умолчанию приемлемым. Если этот экземпляр общего кэша по умолчанию неприемлем, можно вызвать
+setSharedURLCache:
, чтобы установить другой экземплярNSURLCache
, который будет возвращен из этого метода. Вызывающие должны позаботиться о том, чтобы установщик вызывался в то время, когда ни один другой вызывающий объект не имеет ссылки на ранее установленный общий кэш URL. Это делается для того, чтобы предотвратить неожиданное невозможность извлечения хранящихся в кэше данных.
Или документы
Размер ответа достаточно мал, чтобы разумно поместиться в кэш. (Например, если вы предоставляете дисковый кеш, ответ [данные] не должен превышать примерно 5% от размера дискового кеша.)
Я сам включил данные
Так что я думаю, что мое обоснование правильное.
Как работает общий процесс чтения/записи/восстановления кэша?
Я имею в виду, что когда я делаю сетевой запрос в первый раз, весь ответ/ошибка/данные записываются/сохраняются в кеше, а затем сохраняются?
В следующий раз, если я захочу прочитать, он сначала запустится из кеша, а затем, если ответ был не устаревшим/истекшим, он вернет его. Для дискового хранилища ничего не изменится.
Если срок его действия истек, он сделает новый запрос и только после получения успешного ответа удалит ответ из памяти и диска и запишет новый ответ в кеш и на диск. Если новый запрос завершится ошибкой, он не будет очищаться, а просто сохранит устаревшие данные/данные с истекшим сроком действия, поэтому, если мы захотим (загрузить ответ с истекшим сроком действия), он будет загружаться оттуда?
И когда приложение завершается, память сбрасывается. Хранилище на диске остается нетронутым, если на устройстве недостаточно памяти или вы достигли предела размера. При следующем запуске приложения память перезагружает все, что находится на диске, в кеш.
Это восстановление кеша начнет загрузку последних данных, которые были сохранены, а затем перейдет к более старым данным, пока они либо не достигнут своего предела размера, либо просто не достигнут конца элементов, хранящихся на диске. Правильно?
- Если в обычный день объем работы в сети, который пользователь выполняет за типичный 1-часовой сеанс, составляет около 30 МБ, следует ли мне установить размер кэша 20 МБ и 30 МБ дискового пространства? Что делать, если у меня есть изображения? Я слышал, что изображения хранятся по-разному, так как изображение размером 1 МБ может занимать 10 МБ. Итак, как мне с этим справиться?
Я спрашиваю обо всем этом, потому что хочу улучшить опыт кэширования в приложении и улучшить свое общее понимание, поэтому я не буду слишком сильно увеличивать использование памяти * приложением, чтобы оно не сбрасывалось из памяти. приостановленное состояние из-за высокого использования памяти моими приложениями или необходимости других приложений.
*: некоторые из наших сетевых запросов будут загружать эскизы, поэтому мне нужно быть внимательным, когда я увеличиваю лимит размера кэширования.