IOS - Лучшая практика для сохранения изображений локально - NSCache и Save in Document Directory

Я разрабатываю приложение, похожее на канал Instagram (tableviews с ячейками, которые содержат изображения и некоторые метки).

Для всех данных, которые я получаю из базы данных, я использую Data Task (потому что для их получения не требуется многого), но для изображений (которые их url я получаю с запросом данных) Мне нужно сохранить локально для будущего использования (улучшите работу пользователей).

Моя логика такова: Сохранить в NSCache или в каталоге документов, изображения внутри папки с датой их загрузки (создайте ее один раз и приложите все другие изображения, если необходимо) (я удаляю каждую папку, которая не находится за последние 7 дней), а затем для TableView, просто загрузите, если оттуда, так что табличное представление будет плавно прокручиваться и не будет загружать URL-адрес непосредственно из его метода делегирования. Итак, где лучше хранить их в соответствии с моими потребностями, NSCache или Каталог документов.

С нетерпением ждем ваших предложений, спасибо!

Ответ 1

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

Использование кэша постоянной памяти (обычно это папка Caches) используется для другой цели, что избавляет вас от необходимости повторно извлекать ресурс через какой-либо сетевой запрос, но не удерживает ресурс в памяти. Это делает его отличным механизмом кэширования в сеансах запуска приложения или в ситуациях, когда вы столкнулись с давлением памяти, очистили NSCache, но не хотели повторно извлекать актив из сети.

Обратите внимание, что я упоминаю папку Caches для постоянного хранения, тогда как вы предположили, что используете папку Documents, но есть два соображения:

  • Apple уделяет больше внимания приложениям, используя только папку Documents для пользовательских данных, которые невозможно легко воссоздать, и используя папку Caches для данных, которые можно легко восстановить. Подробнее см. Основы файловой системы.

  • Начиная с iOS 11, вы должны хранить только видимые документы пользователя в папке Documents (см. видео WWDC 2017 Fall, iOS Storage Best практика). Даже если вы использовали внутренние файлы, которые не были легко реконструированы, если только целью не было в конечном итоге разоблачение пользователя для них, вы должны использовать каталог Application Support, а не папку Documents.

В нижней строке обычно обычно используется папка Caches для кэша на постоянной основе.

Обратите внимание, что мы часто будем использовать механизм двухуровневого кэша. Загрузите ресурс в папку NSCache и Caches. Затем, когда вы переходите на поиск ресурса, сначала проверьте NSCache (очень быстро), если нет, проверьте постоянное хранилище, а если нет, повторно извлеките актив из сети.

Сказав все это, чтобы сделать его еще более сложным, существует кеш третьего типа, который предоставляется NSURLCache (то есть ответы на сетевые запросы прозрачно кэшируются с помощью NSURLSession и NSURLConnection). Этот кэш продиктован плохо документированными правилами (например, он не будет кэшировать какой-либо отдельный элемент, размер которого превышает 5% от общего размера кеша) и подлежит HTTP-заголовкам, предоставленным сетевым ответом. Однако этот кеш работает в значительной степени прозрачно для вас и обеспечивает как память, так и постоянные кеши хранения. Часто вы можете наслаждаться кешированием NSURLCache без каких-либо вмешательств с вашей стороны. Он бесшовный (когда он работает).