swift - 等待来自 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()
}
解决方案
推荐阅读
- python - 如何在 Windows 的 conda 中从 .yml 文件创建 env?
- kdb - 如何用 5 个字符的代码替换 kdb+ 列表中的零?
- python - 基于 Pandas 数据框中其他列的值范围的列总和
- google-chrome - 更改徽标,Windows 版 Chromium 浏览器的图标
- php - 执行代码时,不会显示 Postgres 错误日志或 VS 代码中的错误。试图将数据插入 PostgreSQL。表仍为空
- node.js - 以快递方式发送大缓冲区的最高效方式?
- python - 如何在python中使用print语句
- python - Python:exec()参数中的函数不起作用
- c++ - 如何创建正确的嵌套循环?
- php - 从愿望清单中获得最佳分配