Какие механизмы кэширования данных вы использовали в iOS?

Ответ

В iOS применяются различные стратегии кэширования в зависимости от типа данных и требований.

Основные подходы:

  1. NSCache — кэш в памяти:

    • Автоматически очищается при нехватке памяти.
    • Потокобезопасен.
    • Идеален для кэширования изображений или объектов.
      let imageCache = NSCache<NSString, UIImage>()
      imageCache.setObject(downloadedImage, forKey: "user_avatar")
      let cachedImage = imageCache.object(forKey: "user_avatar")
  2. URLCache — кэширование сетевых запросов:

    • Кэширует ответы URLSession на диске и в памяти.
    • Настраивается через URLSessionConfiguration.
      let config = URLSessionConfiguration.default
      config.urlCache = URLCache(
      memoryCapacity: 20_000_000, // 20 MB
      diskCapacity: 100_000_000   // 100 MB
      )
  3. Персистентное кэширование:

    • 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 и запихнул куда надо.

А теперь, внимание, самое важное, где все, блядь, обжигаются:

  • Инвалидация кэша — это когда твои данные протухли, а ты их всё ещё из кэша выдаёшь. Надо чётко решить: по времени, по версии, по какому-то флагу с сервера. Иначе будет скандал: «Почему у меня старые новости показываются?!».
  • Размер кэша — тут баланс, блядь. Сделаешь маленький — толку ноль, всё мимо пролетит. Сделаешь большой — память сожрёт, место на диске займёт, и система тебя, неблагодарного, похерит в первую очередь.
  • Безопасность — вот это вообще, ёпта, часто мимо пролетает. Никогда, блядь, НИКОГДА не клади в незашифрованном виде на диск пароли, токены или другую приватную хуйню! Потом будешь удивляться, как её оттуда вытащили. Доверия к файловой системе — ноль ебать.

Вот и вся, блядь, философия. Кажется просто, а как начнёшь делать — каждый раз новая подстава. Но если разобраться — жить можно.