From e46d59ebff933b5e01378698e45cb455b06062f7 Mon Sep 17 00:00:00 2001 From: leoz Date: Sun, 10 Sep 2023 18:48:07 -0400 Subject: [PATCH] Use optional URL --- Sources/CachedImage/CachedImage.swift | 15 ++++++++++----- Sources/CachedImage/ImageLoader.swift | 13 +++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Sources/CachedImage/CachedImage.swift b/Sources/CachedImage/CachedImage.swift index db76222..1595a17 100644 --- a/Sources/CachedImage/CachedImage.swift +++ b/Sources/CachedImage/CachedImage.swift @@ -9,13 +9,13 @@ import SwiftUI public struct CachedImage: View { - private let url: URL + private let url: URL? private let content: (Image) -> Content private let placeholder: Placeholder @StateObject private var loader: ImageLoader public init( - url: URL, + url: URL?, content: @escaping (Image) -> Content, placeholder: @escaping () -> Placeholder ) { @@ -24,7 +24,6 @@ public struct CachedImage: View { self.placeholder = placeholder() _loader = StateObject( wrappedValue: ImageLoader( - url: url, cache: Environment(\.imageCache).wrappedValue ) ) @@ -32,9 +31,15 @@ public struct CachedImage: View { public var body: some View { contentOrImage - .onAppear(perform: loader.load) + .onAppear { + if let _url = url { + loader.load(url: _url) + } + } .onChange(of: url) { newUrl in - loader.reload(url: newUrl) + if let _url = newUrl { + loader.reload(url: _url) + } } } diff --git a/Sources/CachedImage/ImageLoader.swift b/Sources/CachedImage/ImageLoader.swift index b0ed8db..b6313ce 100644 --- a/Sources/CachedImage/ImageLoader.swift +++ b/Sources/CachedImage/ImageLoader.swift @@ -14,14 +14,12 @@ class ImageLoader: ObservableObject { private(set) var isLoading = false - private var url: URL private var cache: ImageCache? private var cancellable: AnyCancellable? private static let imageProcessingQueue = DispatchQueue(label: "image-processing") - init(url: URL, cache: ImageCache? = nil) { - self.url = url + init(cache: ImageCache? = nil) { self.cache = cache } @@ -29,7 +27,7 @@ class ImageLoader: ObservableObject { cancel() } - func load() { + func load(url: URL) { guard !isLoading else { return } if let image = cache?[url] { @@ -41,7 +39,7 @@ class ImageLoader: ObservableObject { .map { PlatformImage(data: $0.data) } .replaceError(with: nil) .handleEvents(receiveSubscription: { [weak self] _ in self?.onStart() }, - receiveOutput: { [weak self] in self?.cache($0) }, + receiveOutput: { [weak self] in self?.cache($0, url) }, receiveCompletion: { [weak self] _ in self?.onFinish() }, receiveCancel: { [weak self] in self?.onFinish() }) .subscribe(on: Self.imageProcessingQueue) @@ -51,8 +49,7 @@ class ImageLoader: ObservableObject { func reload(url: URL) { cancel() - self.url = url - load() + load(url: url) } func cancel() { @@ -67,7 +64,7 @@ class ImageLoader: ObservableObject { isLoading = false } - private func cache(_ image: PlatformImage?) { + private func cache(_ image: PlatformImage?, _ url: URL) { image.map { cache?[url] = $0 } } }