Ответ
Оптимизация загрузки изображений в iOS-приложении.
Проблема: Использование UIImage(named:) или UIImage(contentsOfFile:) для больших изображений в галерее приводило к высокому потреблению памяти и просадкам FPS.
Решение: Реализовал загрузку с downsampling через фреймворк ImageIO. Этот подход декодирует изображение сразу до нужного размера, не загружая в память полную версию.
Пример кода:
func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat = UIScreen.main.scale) -> UIImage? {
let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions) else {
return nil
}
let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale
let downsampleOptions = [
kCGImageSourceCreateThumbnailFromImageAlways: true,
kCGImageSourceShouldCacheImmediately: true,
kCGImageSourceCreateThumbnailWithTransform: true,
kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels
] as CFDictionary
guard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions) else {
return nil
}
return UIImage(cgImage: downsampledImage)
}
Преимущества:
- Снижение потребления памяти: Изображение декодируется сразу в нужном разрешении для UIImageView.
- Ускорение работы: Исключается этап полного декодирования в память с последующим масштабированием.
- Плавный скролл: Галереи остаются отзывчивыми даже с большим количеством изображений.
- Контроль кэширования: Позволяет управлять политикой кэширования через
kCGImageSourceShouldCacheImmediately.
Результат: Потребление памяти при отображении галереи уменьшилось на ~40%, FPS стабильно держится на 60.