我正在尝试创建一个 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()
}