Code: Select all
struct URLImage: View {
let url: URL?
@State private var image: UIImage?
let imageLoader = ImageLoader()
var body: some View {
ZStack {
if let image {
Image(uiImage: image)
} else {
Image(systemName: "heart")
}
}.task {
do {
image = try await imageLoader.loadImage(url: url)
} catch {
// THIS IS FIRED AND IT PRINTS "cancelled" ON THE OUTPUT WINDOW
print(error.localizedDescription)
}
}
}
}
< /code>
Der Imageloader ist für das Abrufen und Abschnitt der Bilder verantwortlich. < /p>
struct ImageLoader {
let httpClient: HTTPClient
private static let cache = NSCache()
init(httpClient: HTTPClient = HTTPClient()) {
self.httpClient = httpClient
}
func loadImage(url: URL?) async throws -> UIImage? {
guard let url = url else {
throw NetworkError.badUrl
}
// check if cache has the image
if let cachedImage = Self.cache.object(forKey: url.absoluteString as NSString) {
return cachedImage
}
// if not in cache then fetch the image
let resource = Resource(url: url, modelType: Data.self)
let data = try await httpClient.load(resource)
guard let uiImage = UIImage(data: data) else {
throw NetworkError.badRequest
}
return uiImage
}
}
< /code>
und Ich verwenden Urlimage wie unten gezeigt: < /p>
List(customers) { customer in
HStack {
URLImage(url: customer.thumbnailImage)
Text(customer.name)
}
}