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

«Какие подходы к кэшированию данных используются в iOS?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

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

    let imageCache = NSCache<NSString, UIImage>()
    imageCache.setObject(decodedImage, forKey: "user_avatar")
    let cachedImage = imageCache.object(forKey: "user_avatar")
  2. URLCache — кэш для сетевых запросов (URLSession). Хранит ответы (CachedURLResponse) по их запросам.

    let config = URLSessionConfiguration.default
    config.urlCache = URLCache(memoryCapacity: 20_000_000, diskCapacity: 100_000_000)
  3. Файловая система (Cache Directory) — для персистентного хранения больших данных (изображения, документы). Содержимое может быть удалено системой, но не во время работы приложения.

    let cacheDir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
    let fileURL = cacheDir.appendingPathComponent("cached_data.dat")
  4. Базы данных (Core Data, Realm, SQLite) — для структурированных данных, требующих сложных запросов, сортировки или отношений.

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

Best Practice для изображений: часто используют двухуровневый кэш — NSCache (память) для быстрого доступа и файловая система (диск) для персистентности.