From 6c571f8db3329898995a7f519df0351a577eb295 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 22:35:11 +0000 Subject: [PATCH] fix: prevent app hang during image scrim color calculation --- View/Catalog/CatalogView.swift | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/View/Catalog/CatalogView.swift b/View/Catalog/CatalogView.swift index b7fd9661..dcfb5cd4 100644 --- a/View/Catalog/CatalogView.swift +++ b/View/Catalog/CatalogView.swift @@ -4019,7 +4019,9 @@ private struct CatalogHeroRemoteImage: View { image = cached.image hasFailed = false isLoading = false - onScrimColorChange(CatalogHeroImageMetadata.scrimColor(from: cached.data) ?? .black) + let color = await CatalogHeroImageMetadata.scrimColor(from: cached.data) + guard !Task.isCancelled else { return } + onScrimColorChange(color ?? .black) } else { guard !Task.isCancelled else { return } image = nil @@ -4140,12 +4142,14 @@ private enum CatalogHeroImageMetadata { let bottom: String? } - static func scrimColor(from data: Data) -> CatalogMarqueeScrimColor? { - guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil } - if let metadataColor = metadataScrimColor(from: source) { - return metadataColor - } - return sampledLeftEdgeColor(from: source) + static func scrimColor(from data: Data) async -> CatalogMarqueeScrimColor? { + await Task.detached(priority: .userInitiated) { + guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil } + if let metadataColor = metadataScrimColor(from: source) { + return metadataColor + } + return sampledLeftEdgeColor(from: source) + }.value } private static func metadataScrimColor(from source: CGImageSource) -> CatalogMarqueeScrimColor? {