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

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

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

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

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

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

2 ответа

Похоже, вам нужно реализовать протокол NSDiscardableContent для объектов, которые вы помещаете в NSCache. Когда объекты в кеше не соответствуют NSDiscardableContent, они выселяются в фоновом режиме приложения в соответствии с этим ответом. /questions/41969836/nscache-i-fon/41969845#41969845

В Apple Docs написано:

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

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

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

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

У меня также была такая же проблема: "кешированные изображения в 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

Другие вопросы по тегам