From 0883475036b869040d5c42be653914d3dee80e40 Mon Sep 17 00:00:00 2001 From: Muukii Date: Wed, 12 Jun 2024 23:34:39 +0900 Subject: [PATCH] Patch --- .../AsyncMultiplexImageNuke.swift | 44 +++++++++++++++++++ .../AsyncMultiplexImageNukeDownloader.swift | 7 +-- .../AsyncMultiplexImage.swift | 27 ------------ .../AsyncMultiplexImage/MultiplexImage.swift | 38 ++++++++++++++++ 4 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNuke.swift create mode 100644 Sources/AsyncMultiplexImage/MultiplexImage.swift diff --git a/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNuke.swift b/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNuke.swift new file mode 100644 index 0000000..3dd506f --- /dev/null +++ b/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNuke.swift @@ -0,0 +1,44 @@ +import AsyncMultiplexImage +import SwiftUI + +public struct AsyncMultiplexImageNuke: View { + + public let image: MultiplexImage + + public init(image: MultiplexImage) { + self.image = image + } + + public var body: some View { + AsyncMultiplexImage( + multiplexImage: image, + downloader: AsyncMultiplexImageNukeDownloader(pipeline: .shared, debugDelay: 0) + ) { phase in + Group { + switch phase { + case .empty: + Rectangle() + .foregroundColor(Color.init(.displayP3, white: 0.9, opacity: 1)) + case .progress(let image): + image + .resizable() + .scaledToFill() + .transition(.opacity.animation(.bouncy)) + case .success(let image): + image + .resizable() + .scaledToFill() + .transition(.opacity.animation(.bouncy)) + case .failure: + Rectangle() + .foregroundColor(Color.init(.displayP3, white: 0.9, opacity: 1)) + } + } + } + } + +} + +#Preview { + AsyncMultiplexImageNuke(image: .init(constant: URL(string: "https://images.unsplash.com/photo-1492446845049-9c50cc313f00?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8")!)) +} diff --git a/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNukeDownloader.swift b/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNukeDownloader.swift index cd66e51..dfdd98b 100644 --- a/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNukeDownloader.swift +++ b/Sources/AsyncMultiplexImage-Nuke/AsyncMultiplexImageNukeDownloader.swift @@ -16,9 +16,10 @@ public struct AsyncMultiplexImageNukeDownloader: AsyncMultiplexImageDownloader { self.debugDelay = debugDelay } - public func download(candidate: AsyncMultiplexImageCandidate, displaySize: CGSize) async throws - -> UIImage - { + public func download( + candidate: AsyncMultiplexImageCandidate, + displaySize: CGSize + ) async throws -> UIImage { #if DEBUG diff --git a/Sources/AsyncMultiplexImage/AsyncMultiplexImage.swift b/Sources/AsyncMultiplexImage/AsyncMultiplexImage.swift index 93175e8..7f16553 100644 --- a/Sources/AsyncMultiplexImage/AsyncMultiplexImage.swift +++ b/Sources/AsyncMultiplexImage/AsyncMultiplexImage.swift @@ -93,33 +93,6 @@ public struct AsyncMultiplexImageCandidate: Hashable { } -public struct MultiplexImage: Hashable { - - public static func == (lhs: MultiplexImage, rhs: MultiplexImage) -> Bool { - lhs.identifier == rhs.identifier - } - - public func hash(into hasher: inout Hasher) { - identifier.hash(into: &hasher) - } - - public let identifier: String - - private(set) var _urlsProvider: @MainActor (CGSize) -> [URL] - - public init( - identifier: String, - urlsProvider: @escaping @MainActor (CGSize) -> [URL] - ) { - self.identifier = identifier - self._urlsProvider = urlsProvider - } - - public init(identifier: String, urls: [URL]) { - self.init(identifier: identifier, urlsProvider: { _ in urls }) - } - -} public struct AsyncMultiplexImage: View { diff --git a/Sources/AsyncMultiplexImage/MultiplexImage.swift b/Sources/AsyncMultiplexImage/MultiplexImage.swift new file mode 100644 index 0000000..2750290 --- /dev/null +++ b/Sources/AsyncMultiplexImage/MultiplexImage.swift @@ -0,0 +1,38 @@ +import Foundation + +public struct MultiplexImage: Hashable { + + public static func == (lhs: MultiplexImage, rhs: MultiplexImage) -> Bool { + lhs.identifier == rhs.identifier + } + + public func hash(into hasher: inout Hasher) { + identifier.hash(into: &hasher) + } + + public let identifier: String + + private(set) var _urlsProvider: @MainActor (CGSize) -> [URL] + + public init( + identifier: String, + urlsProvider: @escaping @MainActor (CGSize) -> [URL] + ) { + self.identifier = identifier + self._urlsProvider = urlsProvider + } + + public init(identifier: String, urls: [URL]) { + self.init(identifier: identifier, urlsProvider: { _ in urls }) + } + +} + +// MARK: convenience init +extension MultiplexImage { + + public init(constant: URL) { + self.identifier = constant.absoluteString + self._urlsProvider = { _ in [constant] } + } +}