Ответ
Преобразование UIImage в Data при кэшировании оптимизирует использование памяти, дискового пространства и производительность загрузки.
Почему это необходимо:
-
Экономия памяти —
UIImageхранится в декодированном виде (пиксельный буфер в RAM), что занимает много места:- Формула:
ширина × высота × 4 байта(для RGBA) - Изображение 1000×1000 пикселей = ~4 МБ в RAM
- Формула:
-
Экономия дискового пространства —
Dataсохраняет сжатое представление (JPEG/PNG):- То же изображение может занимать 100-500 КБ на диске
-
Ускорение загрузки — чтение и запись сжатых данных быстрее
-
Универсальность —
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 одновременно.