Зачем преобразовывать UIImage в Data при кэшировании?

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

Ответ

Преобразование UIImage в Data при кэшировании оптимизирует использование памяти, дискового пространства и производительность загрузки.

Почему это необходимо:

  1. Экономия памятиUIImage хранится в декодированном виде (пиксельный буфер в RAM), что занимает много места:

    • Формула: ширина × высота × 4 байта (для RGBA)
    • Изображение 1000×1000 пикселей = ~4 МБ в RAM
  2. Экономия дискового пространстваData сохраняет сжатое представление (JPEG/PNG):

    • То же изображение может занимать 100-500 КБ на диске
  3. Ускорение загрузки — чтение и запись сжатых данных быстрее

  4. УниверсальностьData можно передавать по сети, сохранять в UserDefaults, Keychain, файлы

Пример кэширования:

// Получение Data из UIImage
let image = UIImage(named: "photo")!
let imageData = image.jpegData(compressionQuality: 0.8) // Сжатие JPEG
// или
let pngData = image.pngData() // Без потерь (PNG)

// Сохранение
UserDefaults.standard.set(imageData, forKey: "cachedImage")
// или
try imageData.write(to: fileURL)

// Загрузка
if let data = UserDefaults.standard.data(forKey: "cachedImage") {
    let restoredImage = UIImage(data: data)
}

Важно: При создании UIImage из Data происходит декодирование в память, поэтому не стоит держать много больших UIImage одновременно.