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

Ответ

В iOS применяют несколько уровней кеширования, от простого хранения в памяти до работы с файловой системой и сетью.

Основные методы:

  1. NSCache — потокобезопасный контейнер, аналогичный словарю, который автоматически удаляет объекты при нехватки памяти. Идеален для временного хранения дорогих в создании объектов, например, декодированных изображений.

    let imageCache = NSCache<NSString, UIImage>()
    imageCache.setObject(decodedImage, forKey: "user_avatar")
    let cachedImage = imageCache.object(forKey: "user_avatar")
  2. URLCache — кеширование HTTP-ответов на уровне URLSession. Позволяет снизить сетевой трафик и ускорить загрузку.

    let config = URLSessionConfiguration.default
    config.urlCache = URLCache(
        memoryCapacity: 10_000_000, // ~10 MB в RAM
        diskCapacity: 100_000_000,  // ~100 MB на диске
        diskPath: "MyAppCache"
    )
    let session = URLSession(configuration: config)
  3. Файловая система — ручное сохранение данных в директории Caches/ (для данных, которые можно пересоздать) и Documents/ (для пользовательских данных). Подходит для изображений, документов, аудио.

  4. Базы данных (Core Data/SQLite) — для структурированных данных, требующих сложных запросов, сортировки и отношений. Core Data также предоставляет встроенный кеш в виде NSManagedObjectContext.

  5. UserDefaults — подходит только для хранения небольших объемов простых типов данных (настройки, флаги). Не является производительным решением для кеширования.

  6. In-memory кеш (самописный) — использование структур данных вроде Dictionary для хранения данных в рамках жизненного цикла объекта (например, ViewModel). Самый быстрый, но неустойчивый способ.

Выбор метода зависит от типа данных (бинарные, структурированные), требований к производительности, необходимости в инвалидации и доступного объема памяти/диска.

Ответ 18+ 🔞

Да ты посмотри, какие у них, блядь, в айфонах замуты с кешированием! Целая наука, ёпта, слоёный пирог из разных способов не гонять туда-сюда одно и то же. Разбираться — терпения ноль ебать, но если вникнуть — всё логично, как два пальца обоссать.

Вот на чём они там, сука, ездят:

  1. NSCache — это типа умный словарь, который не доведёт до ручки, если память кончится. Сам, блядь, начнёт выкидывать старый хлам, чтобы новое влезло. Идеален, если ты, например, картинки декодируешь — работа пиздец ресурсоёмкая. Засунул в кеш — и потом просто достал, а не городил каждый раз.

    let imageCache = NSCache<NSString, UIImage>()
    imageCache.setObject(decodedImage, forKey: "user_avatar")
    let cachedImage = imageCache.object(forKey: "user_avatar") // О, сука, уже готово!
  2. URLCache — это когда ты сетевые запросы кешируешь. Сделал запрос, получил ответ — он прикрутил его куда надо. В следующий раз, когда ту же хуйню запросишь, он может тебе её из кеша подсунуть, даже интернет не трогая. Скорость — овердохуища!

    let config = URLSessionConfiguration.default
    config.urlCache = URLCache(
        memoryCapacity: 10_000_000, // ~10 МБ в оперативке
        diskCapacity: 100_000_000,  // ~100 МБ на диске
        diskPath: "MyAppCache"
    )
    let session = URLSession(configuration: config) // И поехали
  3. Файловая система — старый добрый способ, в рот меня чих-пых. Просто берёшь и пишешь данные в файл. Картинки, документы, мп3шки — всё туда. Только важно не накосячить с папками: Caches/ — для временного барахла, которое не жалко, Documents/ — для ценного, что пользователь нагенерил.

  4. Базы данных (Core Data/SQLite) — это когда у тебя не просто файлы, а целые связи, сортировки и поиски. Данные структурированные, как в аптеке. Core Data — это вообще отдельная песня, у него там свой встроенный кеш в контекстах, блядь.

  5. UserDefaults — а вот это, дружок, НЕ КЕШ! Это, блядь, помойка для мелких настроек: включён ли звук, логин запомнить или нет. Суешь туда что-то тяжёлое — приложение начнёт тормозить, как пьяный в говно. Доверия к нему в этом плане — ебать ноль.

  6. In-memory кеш (самописный) — самый простой и быстрый, как удар током. Завёл себе в памяти какую-нибудь Dictionary и пихаешь туда данные, пока жива твоя вьюмодель или сервис. Вырубил приложение — всё, пизда, кеш испарился. Зато скорость — хуй в пальто!

Какой выбрать? Да, бля, смотри по обстановке! Что кешируешь? Надолго ли? Места сколько есть? Нужно ли это искать или фильтровать? Ответы на эти вопросы и приведут тебя к нужному инструменту. Главное — не использовать UserDefaults не по назначению, а то получишь мартышлюшку вместо приложения.