为tableviewcell设置图像会减慢Swift中的滚动速度

时间:2018-12-08 13:24:48

标签: swift uiimage tableview

我想从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")
                    }
                }

            }

2 个答案:

答案 0 :(得分:1)

您可以尝试SDWebImage

self.imageViewOwne.sd_setImage(with: URL(string:imageUrl), placeholderImage: UIImage(named: "default"))

答案 1 :(得分:1)

“异步”操作是正确的方法。

我建议创建一个单独的类,以使用DownloadingService发起图像请求,并跟踪已下载的图像和未下载的图像。

使您的View Controller(或任何对象都是Table View数据源)使用上面的对象来获取图像对象(从内存或从磁盘缓存;您可能应该在下载后缓存图像)。如果该对象不可用-只需在各处使用一些默认图像(可以是“加载指示器”图像,“用户头像”图像等)。

也许您必须创建一个自定义单元并覆盖prepareForReuse()方法。为该单元格设置默认图像,以防在显示单元格时仍在进行当前下载的情况下,该单元格上不会显示旧的/不正确的图像。

注意:无论您是否使用开源库,步骤都是相同的。