我想从URL加载图像并将其设置为表格视图单元格。
如果我在没有异步的情况下这样做,则会减慢表视图的速度。否则,如果我在异步块中设置了某些图像,则会显示不正确,并且图像将被异步更改。
第二种方法-异步
表格视图单元被重用,并且需要一些时间来获取图像并进行更改。因此,在较短的时间内,tableview单元会显示前一张图片,并且该图片不正确。
DispatchQueue.global(qos: .userInitiated).async {
var userPhoto: UIImage?
if let imageUrl = participant?.image {
let url = URL(string:imageUrl)
if let data = try? Data(contentsOf: url!)
{
userPhoto = UIImage(data: data)
}
}
DispatchQueue.main.async {
if let userPhoto = userPhoto {
self.imageViewOwner.image = userPhoto
} else {
// Sets default image for profile.
self.imageViewOwner.image = UIImage(named: "default")
}
}
}
答案 0 :(得分:1)
您可以尝试SDWebImage
self.imageViewOwne.sd_setImage(with: URL(string:imageUrl), placeholderImage: UIImage(named: "default"))
答案 1 :(得分:1)
“异步”操作是正确的方法。
我建议创建一个单独的类,以使用DownloadingService发起图像请求,并跟踪已下载的图像和未下载的图像。
使您的View Controller(或任何对象都是Table View数据源)使用上面的对象来获取图像对象(从内存或从磁盘缓存;您可能应该在下载后缓存图像)。如果该对象不可用-只需在各处使用一些默认图像(可以是“加载指示器”图像,“用户头像”图像等)。
也许您必须创建一个自定义单元并覆盖prepareForReuse()
方法。为该单元格设置默认图像,以防在显示单元格时仍在进行当前下载的情况下,该单元格上不会显示旧的/不正确的图像。
注意:无论您是否使用开源库,步骤都是相同的。