This library provides an asynchronous image loading solution for SwiftUI applications. It supports loading multiple image resolutions and automatically handles displaying the most appropriate image based on the available space. The library uses Swift's concurrency model, including actors and tasks, to manage image downloading efficiently.
- Asynchronous image downloading
- Supports multiple image resolutions
- Efficient image loading using Swift's concurrency model
- Logging utilities for debugging and error handling
Add the following dependency to your Package.swift
file:
dependencies: [
.package(url: "https://github.com/YourGitHubUsername/AsyncMultiplexImage.git", from: "1.0.0")
]
import AsyncMultiplexImage
AsyncMultiplexImageNuke(image: .init(constant: URL(...)))
- Import the library:
import AsyncMultiplexImage
- Define a
MultiplexImage
with a unique identifier and a closure that returns a list of URLs for different image resolutions:
let multiplexImage = MultiplexImage(identifier: "imageID", urlsProvider: { _ in
[URL(string: "https://example.com/image_small.png")!,
URL(string: "https://example.com/image_medium.png")!,
URL(string: "https://example.com/image_large.png")!]
})
- Create an
AsyncMultiplexImage
view using theMultiplexImage
and a custom downloader conforming toAsyncMultiplexImageDownloader
:
struct MyImageView: View {
let multiplexImage: MultiplexImage
let downloader: MyImageDownloader
var body: some View {
AsyncMultiplexImage(multiplexImage: multiplexImage, downloader: downloader) { phase in
switch phase {
case .empty:
ProgressView()
case .progress(let image):
image.resizable()
case .success(let image):
image.resizable()
case .failure(let error):
Text("Error: \(error.localizedDescription)")
}
}
}
}
- Implement a custom image downloader conforming to
AsyncMultiplexImageDownloader
:
class MyImageDownloader: AsyncMultiplexImageDownloader {
func download(candidate: AsyncMultiplexImageCandidate) async throws -> Image {
// Download the image and return a SwiftUI.Image instance
}
}
This library is available under the MIT License. See the LICENSE file for more information.