diff --git a/cull/Services/ThumbnailCache.swift b/cull/Services/ThumbnailCache.swift index 72fde26..5122574 100644 --- a/cull/Services/ThumbnailCache.swift +++ b/cull/Services/ThumbnailCache.swift @@ -7,6 +7,7 @@ final class ThumbnailCache { private let memoryCache = NSCache() private let previewCache = NSCache() private var previewKeys = Set() + private var preloadTask: Task? private let diskCacheURL: URL private let maxPixelSize: Int @@ -206,7 +207,10 @@ final class ThumbnailCache { } /// Fire-and-forget: preload previews in background. Used during navigation. + /// Cancels any previous preload so stale work doesn't compete. func preloadPreviews(photos: [Photo]) { + preloadTask?.cancel() + let work: [(String, URL)] = photos.compactMap { photo in let key = photo.url.absoluteString guard previewCache.object(forKey: key as NSString) == nil else { return nil } @@ -216,13 +220,15 @@ final class ThumbnailCache { let pc = previewCache - Task.detached(priority: .utility) { + preloadTask = Task.detached(priority: .utility) { for batchStart in stride(from: 0, to: work.count, by: 4) { + guard !Task.isCancelled else { return } let batch = Array(work[batchStart..