我想显示列表中json中检索到的URL中的图像。我该怎么办?
我尝试仅调用图像并输入URL,但它仅显示图像的空间,而不显示实际图像。
var body: some View {
NavigationView {
List {
TextField("Search for Meme by name", text: self.$searchItem)
ForEach(viewModel.memes) { meme in
HStack {
VStack(alignment: .leading, spacing: 2) {
Text(meme.name).font(.headline).lineLimit(nil)
Image(meme.url).resizable().frame(width: 100, height: 100)
}
}
}
}
.navigationBarTitle("All Memes")
}.onAppear {
self.viewModel.fetchAllMemes()
}
}
答案 0 :(得分:0)
制作自己的视图,该视图具有自己的ObservableObject,该ObservableObject下载(并可选地缓存)图像。这是一个示例:
import SwiftUI
import Combine
import UIKit
class ImageCache {
enum Error: Swift.Error {
case dataConversionFailed
case sessionError(Swift.Error)
}
static let shared = ImageCache()
private let cache = NSCache<NSURL, UIImage>()
private init() { }
static func image(for url: URL) -> AnyPublisher<UIImage?, ImageCache.Error> {
guard let image = shared.cache.object(forKey: url as NSURL) else {
return URLSession
.shared
.dataTaskPublisher(for: url)
.tryMap { (tuple) -> UIImage in
let (data, _) = tuple
guard let image = UIImage(data: data) else {
throw Error.dataConversionFailed
}
shared.cache.setObject(image, forKey: url as NSURL)
return image
}
.mapError({ error in Error.sessionError(error) })
.eraseToAnyPublisher()
}
return Just(image)
.mapError({ _ in fatalError() })
.eraseToAnyPublisher()
}
}
class ImageModel: ObservableObject {
@Published var image: UIImage? = nil
var cacheSubscription: AnyCancellable?
init(url: URL) {
cacheSubscription = ImageCache
.image(for: url)
.replaceError(with: nil)
.receive(on: RunLoop.main, options: .none)
.assign(to: \.image, on: self)
}
}
struct RemoteImage : View {
@ObservedObject var imageModel: ImageModel
init(url: URL) {
imageModel = ImageModel(url: url)
}
var body: some View {
imageModel
.image
.map { Image(uiImage:$0).resizable() }
?? Image(systemName: "questionmark").resizable()
}
}