未在swiftui collectionview上加载图像

未在swiftui collectionview上加载图像,swift,swiftui,Swift,Swiftui,我正在尝试加载图像,但图像未加载 我设置了我的图像加载器 class ImageLoader: ObservableObject { @Published var image: UIImage? private let url: URL private var cancellable: AnyCancellable? init(url: URL) { self.url = url } deinit { cancellable?.cancel() } fu

我正在尝试加载图像,但图像未加载

我设置了我的图像加载器

class ImageLoader: ObservableObject {
@Published var image: UIImage?
private let url: URL
private var cancellable: AnyCancellable?

init(url: URL) {
    self.url = url
}

 deinit {
       cancellable?.cancel()
   }

   func load() {
       cancellable = URLSession.shared.dataTaskPublisher(for: url)
           .map { UIImage(data: $0.data) }
           .replaceError(with: nil)
           .receive(on: DispatchQueue.main)
           .assign(to: \.image, on: self)
   }
   
   func cancel() {
       cancellable?.cancel()
   }
 }
然后是异步映像结构

struct AsyncImage<Placeholder: View>: View {
@ObservedObject private var loader: ImageLoader
private let placeholder: Placeholder?

init(url: URL, placeholder: Placeholder? = nil) {
    loader = ImageLoader(url: url)
    self.placeholder = placeholder
}

var body: some View {
    image
        .onAppear(perform: loader.load)
        .onDisappear(perform: loader.cancel)
}

private var image: some View {
    placeholder
}
}





struct ProductSearhView: View {
 @ObservedObject var model: SearchResultViewModel
var body: some View{
    NavigationView {
         List {
                ForEach(0 ..< Global.productArry.count) { value in
                     CollectionView(model: self.model, data: Global.productArry[value])
                }
                
         }.navigationBarTitle("CollectionView")
    }


 }

}



struct CollectionView: View {
 @ObservedObject var model: SearchResultViewModel

let data: Product
    var body: some View {
        VStack {
            HStack {
                 
                Spacer()
                    AsyncImage(url: URL(string: self.data.productImageUrl)!, placeholder: Text("Loading ...")
                    ).aspectRatio(contentMode: .fit)
                Spacer()
               
            }
            HStack {
                Spacer()
                Text(self.data.name)
                Spacer()
                
                 }
        }.onAppear(perform:thisVal)
     }

func thisVal (){
    
    print(self.data.productImageUrl)
    // https://i5.walmartimages.com/asr/113d660f-8b57-4ab8-8cfa-a94f11b121aa_1.f6bad4b281983e164dcf0a160571e886.jpeg?odnHeight=180&odnWidth=180&odnBg=ffffff
    
}
}
struct AsyncImage:视图{
@ObservedObject私有变量加载程序:ImageLoader
私人出租占位符:占位符?
初始化(url:url,占位符:占位符?=nil){
loader=ImageLoader(url:url)
self.placeholder=占位符
}
var body:一些观点{
形象
.onAppear(执行:loader.load)
.onDisappear(执行:loader.cancel)
}
私有var映像:一些视图{
占位符
}
}
结构产品searhview:视图{
@观察对象var模型:SearchResultViewModel
var body:一些观点{
导航视图{
名单{
ForEach(0..
除了图像加载,其他一切都正常。该图像仅显示占位符,而不显示图像。 要加载的示例图像url如下所示


我做错了什么?

看起来你丢失了一张图像。 如果您有:

private var image: some View {
    placeholder
}
你只会有一个占位符。 如果您将其更改为:

private var image: some View {
    Group {
        if loader.image != nil {
            Image(uiImage: loader.image!)
                .resizable()
        } else {
            placeholder
        }
    }
}
这意味着如果
ImageLoader
已成功加载图像,它将使用加载的uiImage显示
image
,否则它将显示占位符