当前位置:  开发笔记 > 前端 > 正文

异步更新表格单元格图像

如何解决《异步更新表格单元格图像》经验,为你挑选了1个好方法。

我从json下载图像链接,然后在表视图开始创建其单元格后创建图像:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellController

            DispatchQueue.main.async(execute: { () -> Void in

                if let url = NSURL(string: self.movies[indexPath.row].image) 
                {

                    if let data = NSData(contentsOf: url as URL)
                    {
                        let imageAux = UIImage((data: data as Data))
                        cell.movieImage.image = imageAux
                        self.tableView.reloadData()

                    }
                }
            })

        cell.name = self.movies[indexPath.row].name
        cell.date = self.movies[indexPath.row].date
        return cell
}

这样工作正常,但表视图变得非常慢,不是在渲染时,而是在滚动时.我一直在检查RAM和CPU,两者都非常低,但我的网络使用量不断上升但是图像已经在单元格上,所以这意味着它已经完成了.(对于这个测试我只调用2个电影的JSON,所以2个图像)

在我开始这样做之前,我的总下载量大约为200kb(带图像),现在它在我停止项目之前已超过2MB.

我做错了什么?



1> Michael Four..:

您可能希望为后台活动指定一个单独的队列.在这种情况下,您的繁重网络任务是:

NSData(contentsOf: url as URL)

这就是"冻结"UI的原因.最好的解决方案是定义类似的东西DispatchQueue.background并在那里执行网络调用,然后稍后在主线程上执行UI任务,以免锁定显示:

DispatchQueue.background.async(execute: { () -> Void in
    if let url = NSURL(string: self.movies[indexPath.row].image)  {
        //Do this network stuff on the background thread
        if let data = NSData(contentsOf: url as URL) {
            let imageAux = UIImage(data: data as Data)
            //Switch back to the main thread to do the UI stuff
            DispatchQueue.main.async(execute: { () -> Void in
                cell.movieImage.image = imageAux
            })
        }
    }
})

如果这是有道理的,请告诉我.


我会将图像@Adrian缓存到`NSCache`文档中.它很容易使用.如果您发布另一个问题,我可以添加一个我的UIImage缓存代码片段作为示例
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有