首页 > 解决方案 > 等待来自 API 的图像时,如何在 Koloda 方法中返回 UIView?

问题描述

我正在尝试创建一个 Tinder for Movies 应用程序,其中使用电影数据库 API 加载电影,并且我正在使用 Koloda pod 进行刷卡功能。我遇到了一个问题,我必须实现一个 Koloda 数据源方法,我必须返回一个 UIView(将显示在卡上)。

问题是我想从数据库中检索图像,如果我预先加载所有图像,它可能会使应用程序变慢,所以我想在需要时检索每个图像。这会导致错误,因为检索图像是异步的,尽管使用了完成处理程序,但我遇到了无法从闭包内返回值的问题,因为它仍然需要闭包外的返回值。但是如果我要在闭包之外提供另一个返回值,这个返回语句总是会被触发,我无法返回我想要检索的图像。这意味着我将始终返回 noImageAvailable 图像。我可以知道如何解决这个问题吗?谢谢!

    func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
    
    let movie = movies[index]
    let poster = movie.posterImage
    var imageView = UIImageView(image: UIImage(named: "noImageAvailable"))
    
    guard let posterString = poster else {
        return imageView
    }
    
    let urlString = "https://image.tmdb.org/t/p/w300" + posterString
    
    guard let posterImageURL = URL(string: urlString) else {
        return imageView
    }
    
    
    getImageDataFrom(url: posterImageURL) { image in
        DispatchQueue.main.async {
            imageView = UIImageView(image: image)

        }
    }
    
    return imageView
    
}


private func getImageDataFrom(url: URL, handler: @escaping (UIImage) -> Void) {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        // Handle Error
        if let error = error {
            print("DataTask error: \(error.localizedDescription)")
            return
        }
        
        guard let data = data else {
            // Handle Empty Data
            print("Empty Data")
            return
        }
        
        if let image = UIImage(data: data) {
            handler(image)
        } else {
            handler(UIImage(named: "noImageAvailable")!)
        }
    }.resume()
}

标签: swiftapiasynchronouscompletionhandlerkoloda

解决方案


推荐阅读