Как установить кеш iOS и размер дискового хранилища и как кеш восстанавливается из дискового хранилища после завершения работы приложения?

Я уже спрашивал когда именно все становится удалить из памяти и диска urlcache?

Теперь у меня есть еще несколько уточняющих вопросов:

  1. Кэш памяти ограничен оперативной памятью iPhone (обычно 2 Гб). А вот дисковое Persistence ограничено 64Gb или 128Gb. Это правильно?

  2. Есть ли смысл иметь постоянство больше, чем ваша память. Может ли это быть полезно, если вы не хотите иметь большой объем памяти (и не хотите, чтобы приложение было завершено из его приостановленного состояния), т.е. разрешить восстановление кеша из дискового хранилища, а затем вернуть сохраненные результаты?

После контрольного нажатия на URLCache.shared вижу следующие комментарии:

  • Объем памяти: 4 мегабайта (4*1024*1024 байта)
  • Емкость диска: 20 мегабайт (20*1024*1024 байт)
  • Путь к диску:(user home directory)/Library/Caches/(application bundle id)

Пользователи, не предъявляющие особых требований или ограничений к кэшированию, должны найти экземпляр общего кэша по умолчанию приемлемым. Если этот экземпляр общего кэша по умолчанию неприемлем, можно вызвать +setSharedURLCache:, чтобы установить другой экземпляр NSURLCache, который будет возвращен из этого метода. Вызывающие должны позаботиться о том, чтобы установщик вызывался в то время, когда ни один другой вызывающий объект не имеет ссылки на ранее установленный общий кэш URL. Это делается для того, чтобы предотвратить неожиданное невозможность извлечения хранящихся в кэше данных.

Или документы

Размер ответа достаточно мал, чтобы разумно поместиться в кэш. (Например, если вы предоставляете дисковый кеш, ответ [данные] не должен превышать примерно 5% от размера дискового кеша.)

Я сам включил данные

Так что я думаю, что мое обоснование правильное.


Как работает общий процесс чтения/записи/восстановления кэша?

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

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

    Если срок его действия истек, он сделает новый запрос и только после получения успешного ответа удалит ответ из памяти и диска и запишет новый ответ в кеш и на диск. Если новый запрос завершится ошибкой, он не будет очищаться, а просто сохранит устаревшие данные/данные с истекшим сроком действия, поэтому, если мы захотим (загрузить ответ с истекшим сроком действия), он будет загружаться оттуда?

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

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

  4. Если в обычный день объем работы в сети, который пользователь выполняет за типичный 1-часовой сеанс, составляет около 30 МБ, следует ли мне установить размер кэша 20 МБ и 30 МБ дискового пространства? Что делать, если у меня есть изображения? Я слышал, что изображения хранятся по-разному, так как изображение размером 1 МБ может занимать 10 МБ. Итак, как мне с этим справиться?

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


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


person Honey    schedule 04.10.2018    source источник
comment
РЕДАКТИРОВАТЬ описание вознаграждения: ... И последнее, но не менее важное: если URLCache с такой легкостью предлагает такую ​​службу кэширования (для кэширования изображений), то почему существуют сторонние фреймворки? Какие у них есть преимущества?   -  person Honey    schedule 08.10.2018


Ответы (1)


Если вы хотите глубже узнать об управлении памятью, вам следует погрузиться в API более низкого уровня. URLSession, URLCache и т. д. — API очень высокого уровня. Существует множество сессий WWDC о фреймах памяти, кэшировании изображений, сетевом кэшировании и т. д. Каждая часть имеет много объяснений. Я предлагаю вам посмотреть все видео WWDC (если вы еще не смотрели) для старта и разминки. В некоторых темах есть отличное объяснение основных понятий, подобных этому.

взгляните на эти два с WWDC этого года:

Рекомендации по работе с изображениями и графикой

Подробное изучение памяти iOS

Мы можем сидеть здесь и обсуждать ваши вопросы неделями! Но для быстрого ответа:

  1. да. Память ограничена из-за размера оперативной памяти, а диск ограничен из-за размера хранилища. Устройство и iOS могут играть с максимальным лимитом в зависимости от своих потребностей.
  2. Собственно и это одна из основных целей использования диска. Существует концепция под названием Swap Memory (для более подробного изучения и исследований, если хотите).

Сжатые данные временно перемещаются на диск, чтобы освободить место в памяти для недавно использованных данных.

Но у памяти есть свой кеш в своих кадрах. Иногда кэширование снижает производительность, а не улучшает ее. Из-за frame.

  1. Не всегда. По умолчанию кэшируются только успешные запросы (если сервер не запрашивает у клиента «не кэшировать» в заголовке). Но, как вы, возможно, знаете, URLSession имеет множество настроек для кэширования на диске, в памяти и т. д. в API очень высокого уровня. См. документацию по сеансу URL.

  2. См. документацию по NSURLRequestCachePolicy. И это хорошее руководство по этому поводу.  NSURLRequestCachePolicy В зависимости от выбранной политики она ведет себя по-разному и может очищать предыдущий кеш или сохранять его до следующего успеха.

  3. HomeDirectory содержит несколько основных каталогов. iOS ведет себя по-разному с каждым из них. iOS очистит только каталог tmp (где находится кеш диска). Вы можете хранить кеш в другом каталоге, например Documents, чтобы iOS не смогла его удалить. Но дело в значении самого слова cache.

  4. Любое меньшее или даже большее пространство от фактической потребности имеет решающее значение. Это может повредить процесс или растратить память/диск. Помните причину изобретения списков ссылок? У вас могут быть разные кеши для разных целей, таких как изображения и JSON. Но дело в изображениях:

Использование памяти изображений

Все они лежат в основе фреймворка Foundation, а все известные третьи стороны являются просто оболочками вокруг них. Таким образом, единственными преимуществами, которые они имеют, являются: Предопределенные значения по умолчанию, основанные на знаниях тысяч участников и API более высокого уровня.

Alamofire и Kingfisher — отличный тому пример.

Заключение

Правильный размер кэша зависит от варианта использования. Зависит от количества вариантов данных, количества изображений, размера каждого изображения, частоты обращения к одному и тому же изображению и т. д. Например, если вы постоянно меняете изображение в кеше, это может отрицательно сказаться на времени автономной работы! Лучший способ выбрать подходящий размер кэша — это протестировать. Запустите приложение в разделе «Инструменты», чтобы измерить как производительность, так и использование батареи. Продолжайте увеличивать размер кеша, пока не перестанете различать производительность. Это самый большой размер, который вам понадобится, по крайней мере, в условиях испытаний. Затем уменьшите размер до тех пор, пока производительность не станет едва приемлемой, чтобы определить наименьший приемлемый размер. Правильный размер находится где-то между этими двумя размерами, в зависимости от того, что вы считаете важным.

person Mojtaba Hosseini    schedule 13.10.2018
comment
где ваши предложения по настройке размера кеша и диска? Как я должен придумать хороший размер? - person Honey; 14.10.2018
comment
Я добавляю раздел заключения к моему ответу с решением, чтобы вы придумали хороший размер. - person Mojtaba Hosseini; 14.10.2018
comment
Я понимаю, о чем вы говорите, но можете ли вы привести пример и применить к нему общие правила? дастет дард наконе - person Honey; 15.10.2018
comment
Я люблю, но, к сожалению, я в середине тяжелого проекта, и у меня нет времени, чтобы создать этот документ для вас. Это занимает много времени и зависит. В Интернете есть много полезных руководств, которые помогут вам в этом. Тогда, возможно, вам следует открыть еще один вопрос с вашими документами по тестированию, и сообщество поможет. В конце не стесняйтесь упоминать этот ответ там и уведомлять меня. - person Mojtaba Hosseini; 15.10.2018
comment
Если вы найдете мой ответ полезным, пожалуйста, не забудьте проголосовать и отметить его как ответ. Спасибо. - person Mojtaba Hosseini; 15.10.2018
comment
Я понимаю. Мой вопрос хорошо ориентирован на расчет размера. Есть сладкое пятно иметь эффективную память, и я пытаюсь выяснить это. Если есть какие-либо учебные пособия о том, как выполнить расчет, пожалуйста, дайте ссылку на них здесь. Я взгляну. (я уже проголосовал) - person Honey; 15.10.2018