Ios Swift-慢速UITableView滚动(从设备存储器加载图像)

Ios Swift-慢速UITableView滚动(从设备存储器加载图像),ios,swift,uitableview,uiimage,grand-central-dispatch,Ios,Swift,Uitableview,Uiimage,Grand Central Dispatch,我有一个UITableView,其中填充了单元格,这些单元格要么包含一个文本标签,要么包含一个文本标签和一个UIImage。当应用程序运行时,图像将从我的服务器下载并存储在本地设备上。每次运行应用程序时,应用程序都会检查并下载新图像。在我的cellforrowatinexpath函数中,我从后台线程上的设备存储器加载图像,然后在主线程上更新UI 我不知道这样做是否正确,但以下是我在cellforrowatinexpath函数中显示图像的代码: dispatch_async(dispatch_ge

我有一个UITableView,其中填充了单元格,这些单元格要么包含一个文本标签,要么包含一个文本标签和一个UIImage。当应用程序运行时,图像将从我的服务器下载并存储在本地设备上。每次运行应用程序时,应用程序都会检查并下载新图像。在我的
cellforrowatinexpath
函数中,我从后台线程上的设备存储器加载图像,然后在主线程上更新UI

我不知道这样做是否正确,但以下是我在
cellforrowatinexpath
函数中显示图像的代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        for image in self.postsImages {
            if ((image as! NSArray)[0] as! Int == postIDCurrent) {
                // there is an image associated with this post

                let postImage = UIImage(contentsOfFile: (currentArray.lastObject as? String)!)
                dispatch_async(dispatch_get_main_queue(), {
                    cell.postImageView.image = postImage
                    cell.postImageView.clipsToBounds = true
                    cell.postImageView.userInteractionEnabled = true
                    cell.postImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(PostsTableViewController.imageTapped(_:))))
                })
            }
        }
    })
for
if
语句都只是检查是否存在与我们要显示的当前单元格相关联的图像

如果我没有提供足够的信息,我很抱歉。如果您还需要什么,请留言


无论如何,我的问题是,我对这段代码做了什么错误,导致我的UITableView滚动速度非常慢?尝试中断for循环:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    for image in self.postsImages {
        if ((image as! NSArray)[0] as! Int == postIDCurrent) {
            // there is an image associated with this post

            let postImage = UIImage(contentsOfFile: (currentArray.lastObject as? String)!)
            dispatch_async(dispatch_get_main_queue(), {
                cell.postImageView.image = postImage
                cell.postImageView.clipsToBounds = true
                cell.postImageView.userInteractionEnabled = true
                cell.postImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(PostsTableViewController.imageTapped(_:))))
            })
            break
        }
    }
})

positmage很可能比cell.positmageview的边界大得多,因此主线程上的赋值需要相当长的时间才能缩小。假设postImageView的边界是可预见的,在后台线程中将图像缩放到正确的大小很可能会解决这个问题。如果您手头没有调整大小的功能,那么表是缓慢滚动还是突然滚动?我要做的第一个优化是将
self.postsImages
作为字典而不是数组。字典上的int查找比遍历整个数组快得多(在找到所需图像后,不会中断for循环)。我不确定在哪里定义了
currentArray
,在哪里获取图像字符串…要跳回主线程,请尝试使用
dispatch\u async
而不是
dispatch\u sync
@Putz1103,抱歉没有指定。表格快速滚动意味着每当屏幕上出现新的单元格时,表格就会冻结,然后突然向下滚动
currentArray
是保存我们正在生成的当前单元格的所有内容的数组。它保存Post ID、标签文本以及设备本身上图像的路径。图像路径是数组中的最后一个对象。我将研究制作一本词典。很抱歉没有指定所有这些信息,但感谢您的回复。@paulvs遗憾的是,这并没有解决问题。不过感谢您的回复。在找到要查找的映像后,您需要中断for循环,否则循环将继续在主线程上运行。不幸的是,这并没有解决问题,但感谢提醒我中断
for
循环。非常感谢此解决方案。这修复了滚动问题。但是,使用此解决方案会出现一个新的小问题。如果滚动速度足够快,单元格中的图像将闪烁错误的图像(先前在屏幕上可以看到的单元格图像),然后突然变回正确的图像。这没什么大不了的,因为它只发生在用户快速滚动时,但如果我能找到解决方案,那就太棒了。非常感谢您的回复。您应该能够通过在
prepareforeuse
中将图像指定为nil对其进行排序。这也是一个清空文本字段、中止网络访问和打开的好地方。很抱歉,我对UITableView没有太多的工作,什么是
预处理
?它是一个函数吗?抱歉,如果我的问题听起来很傻……这是一种
UITableViewCell
方法,您可以覆盖它,为重用做准备:)它起作用了。说真的,我真的很感谢你的帮助。在过去的三天里,我试图解决这个问题,差点累死自己,谢谢:)