首页 > 解决方案 > SwiftUI 加载的异步图像未显示

问题描述

我想将 xml 文件中的图像异步加载到我的 SwiftUI 视图中,但它不起作用。加载的图像未显示。但是,如果我使用Data(contentsOf: imageURL)方法一切都很好!

你有什么想法吗?

这是 xml 解析器片段:

// 2
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    
    if elementName == "item" {
        let imageURL = URL(string: podcastImage)!
        //let imageData = try! Data(contentsOf: imageURL) // load sync and works
        //let image = UIImage(data: imageData) // load sync and works
        let remoteImageLoader = ImageLoader(imageURL: imageURL)  // Async not showing images
        let image = UIImage(data: remoteImageLoader.data) // Async not showing images
        podcasts.append(
            Station(
                name: podcastTitle,
                detail: "Podcast",
                url: URL(string: podcastURL)!,
                image: image,
                imageUrl: podcastImage
        ))
    }
    
}

这是图像加载器

import Combine
import SwiftUI

class ImageLoader: ObservableObject {

@Published var data: Data = Data()

init(imageURL: URL) {
    URLSession.shared.dataTask(with: imageURL) { data, response, error in
        guard let recievedData = data, error == nil  else {
            print("Error: No Data")
            return
        }
        print("Got Data") // Doesn't output to console
        print(recievedData) // Doesn't output to console
        DispatchQueue.main.async {
            self.data = recievedData
        }
    }
    .resume()
  }
}

播客就是这样的结构,我在其他文件/视图中使用它

struct Station: Identifiable, Hashable {
var id = UUID()
let name: String
let detail: String
let url: URL
var image: UIImage?
let imageUrl: String


init(name: String, detail: String, url: URL, image: UIImage? = nil, imageUrl: String) {
    self.name = name
    self.detail = detail
    self.url = url
    self.image = image
    self.imageUrl = imageUrl
}

}

标签: swiftimageasynchronousswiftuixml-parsing

解决方案


推荐阅读