Ответ
В iOS применяются различные стратегии кэширования в зависимости от типа данных и требований.
Основные подходы:
-
NSCache— кэш в памяти:- Автоматически очищается при нехватке памяти.
- Потокобезопасен.
- Идеален для кэширования изображений или объектов.
let imageCache = NSCache<NSString, UIImage>() imageCache.setObject(downloadedImage, forKey: "user_avatar") let cachedImage = imageCache.object(forKey: "user_avatar")
-
URLCache— кэширование сетевых запросов:- Кэширует ответы
URLSessionна диске и в памяти. - Настраивается через
URLSessionConfiguration.let config = URLSessionConfiguration.default config.urlCache = URLCache( memoryCapacity: 20_000_000, // 20 MB diskCapacity: 100_000_000 // 100 MB )
- Кэширует ответы
-
Персистентное кэширование:
- Core Data / SQLite: Для структурированных данных, требующих сложных запросов.
- Файловая система: Для больших бинарных данных (например, PDF).
UserDefaults: Только для очень небольших, простых значений (настройки, флаги).
Практическое применение:
- Изображения: Использование библиотек (Kingfisher, SDWebImage), которые реализуют
NSCache+ диск. - API-ответы: Кэширование JSON с помощью
URLCacheили сериализация в Codable-модели.
Критически важные аспекты:
- Инвалидация кэша: Определение, когда данные устарели.
- Размер кэша: Баланс между производительностью и использованием памяти/диска.
- Безопасность: Не кэшировать конфиденциальные данные в незашифрованном виде на диск.
Ответ 18+ 🔞
А, ну вот, опять про это ваше кэширование, блядь. Сидишь такой, думаешь — ну что тут сложного, положил и взял. Ан нет, сука, целая наука, ёпта! Как будто ядра изумрудные подбираешь, а не данные какие-то.
Смотри, есть у них там, у этих яблочников, несколько контор, куда можно своё барахло свалить, чтобы потом быстро достать. И каждая — со своими, блядь, тараканами в голове.
Первая лавочка — NSCache.
Это типа как твой карман, только в оперативке. Кинул туда фотку аватарки — быстро достал. А система как начнёт орать, что память кончается, — он сам, хитрая жопа, потихоньку мусор выкинет, чтобы всё не легло. Потокобезопасный, то есть с разных мест можно тыкать — не поссётся. Красота!
let imageCache = NSCache<NSString, UIImage>()
imageCache.setObject(downloadedImage, forKey: "user_avatar")
let cachedImage = imageCache.object(forKey: "user_avatar")
Вторая — URLCache.
Это уже для сетевых дел. Запросил ты что-то из интернета, а он тебе ответ, сука, припрятал. На диске и в памяти. И когда опять попросишь — он тебе не полезет в сеть, как лох, а из закромов достанет. Размеры, конечно, надо самому указать, а то он по дефолту такие смешные лимиты ставит, что один мемес закэшируешь — и всё, пиздец, переполнение.
let config = URLSessionConfiguration.default
config.urlCache = URLCache(
memoryCapacity: 20_000_000, // 20 МБ, не жмоться
diskCapacity: 100_000_000 // 100 МБ на диске
)
Ну и третье — персистентное, то есть надолго. Тут уже, блядь, вариантов — овердохуища.
- Core Data / SQLite — это когда тебе не просто сохранить, а ещё и умные запросы по этому всему делать надо. Типа «покажи всех юзеров, которые заходили вчера и у них имя на «А». Для простого кэша — как из пушки по воробьям, конечно.
- Файловая система — тупо пишешь файлы в папки. Для всяких PDF-ок, видео или архивов — то, что надо. Просто, как три копейки.
UserDefaults— а вот это, блядь, ловушка для распиздяев! Туда только мелкие флажки, настройки, булевы значения. Никаких, блядь, массивов на десять тысяч объектов! Иначе потом будешь орать «почему моё приложение такое медленное, сука?!», а оно просто этот твой UserDefaults, раздутый как шар, с диска читает.
На практике-то как?
Ну, с картинками все эти умные дядьки уже давно библиотеки написали — Kingfisher там, SDWebImage. Там внутри и NSCache, и диск, и инвалидация, всё, блядь, прикручено. Бери — пользуйся, не изобретай велосипед.
С ответами от API можно через тот же URLCache кэшировать, а можно и самому, если хочешь контроль полный, — сериализовал Codable-модель в Data и запихнул куда надо.
А теперь, внимание, самое важное, где все, блядь, обжигаются:
- Инвалидация кэша — это когда твои данные протухли, а ты их всё ещё из кэша выдаёшь. Надо чётко решить: по времени, по версии, по какому-то флагу с сервера. Иначе будет скандал: «Почему у меня старые новости показываются?!».
- Размер кэша — тут баланс, блядь. Сделаешь маленький — толку ноль, всё мимо пролетит. Сделаешь большой — память сожрёт, место на диске займёт, и система тебя, неблагодарного, похерит в первую очередь.
- Безопасность — вот это вообще, ёпта, часто мимо пролетает. Никогда, блядь, НИКОГДА не клади в незашифрованном виде на диск пароли, токены или другую приватную хуйню! Потом будешь удивляться, как её оттуда вытащили. Доверия к файловой системе — ноль ебать.
Вот и вся, блядь, философия. Кажется просто, а как начнёшь делать — каждый раз новая подстава. Но если разобраться — жить можно.