Ответ 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
без каких-либо вмешательств с вашей стороны. Он бесшовный (когда он работает).