NSCache всегда вытесняет данные изображения, когда приложение переходит в фоновый режим

Это может быть ожидаемым поведением, но Apple четко не заявляет.

Я использую NSCache для кэширования некоторых изображений для моего UICollectionView. Когда я помещаю приложение в фоновый режим и открываю его снова (немедленно), все мои изображения больше не находятся в папке NSCache.

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

Я просто хотел опубликовать здесь для проверки работоспособности и убедиться, что я не упустил ничего очевидного.

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


person chrysb    schedule 11.11.2013    source источник


Ответы (3)


Похоже, вам нужно реализовать протокол NSDiscardableContent для объектов, которые вы помещаете в NSCache. Когда объекты в кеше не соответствуют NSDiscardableContent, они удаляются при фоновом режиме приложения в соответствии с этим ответом. https://stackoverflow.com/a/13579963

person Todd    schedule 13.01.2014

В документах Apple говорится:

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

Таким образом, он удаляет некоторые элементы, а не все элементы. Это зависит от внутренних политик NSCache, доступной памяти, состояния устройства и т. д. Кроме того, прочитайте немного о протоколе NSDiscardableContent.

Из документов:

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

person Abhinav    schedule 11.11.2013
comment
Я протестировал его таким образом, что поместил несколько изображений в кеш, поместил приложение в фоновый режим и вернул его на передний план, и эти изображения, похоже, были вытеснены. Я кэширую изображения после их получения из setImageWithURLRequest AFNetworking. Интересно, это как-то связано? Может быть, что-то еще выпускает изображения, когда приложение уходит в фоновый режим? - person chrysb; 11.11.2013
comment
Я согласен, и это то, что упоминается в документах. Возможно, вы захотите использовать некоторые переменные сеанса (например, класс singleton) и вместо этого установить их. - person Abhinav; 11.11.2013
comment
Спасибо - попробую еще и отчитаюсь. - person chrysb; 11.11.2013
comment
У меня тоже было то же самое... поэтому я использовал NSDiscardableContent, чтобы не удалять кешированное изображение из NSCache, когда приложение переходит в фоновый режим. Я создал пример приложения github.com/SurendraK11/CachingImage CacheItem является генетическим классом, подтверждает NSDiscardableContent. Основная цель этого класса — обернуть элемент в хранимое свойство. - person Surendra Kumar; 09.05.2019

У меня также была такая же проблема: «кэшированные изображения в NSCache удаляются, когда приложение переходит в фоновый режим». Я создал пример для решения этой проблемы, доступный в github https://github.com/SurendraK11/CachingImage/tree/master/CachingImages

Импорт здесь невозможен, UIImage не кэшируется напрямую в NSCache. Это завернуто в общий класс CacheItem, который подтверждает NSDiscardableContent, где isContentDiscarded возвращает false, а beginContentAccess возвращает true

Дополнительная информация о NSDiscardableContent https://developer.apple.com/documentation/foundation/nsdiscardablecontent

person Surendra Kumar    schedule 03.05.2019