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

时间:2016-05-09 16:54:31

标签: ios swift uitableview uiimage grand-central-dispatch

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

我不知道我是否正确行事,但这是我在cellForRowAtIndexPath函数中显示图片的代码:

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(_:))))
                })
            }
        }
    })

forif语句都只是真正检查是否存在与我们要显示的当前单元格关联的图像。

如果我没有提供足够的信息,我很抱歉。如果您还需要更多信息,请发表评论。

无论如何,我的问题是,这段代码我做错了什么导致我的UITableView滚动速度非常慢?

2 个答案:

答案 0 :(得分:3)

有可能postImage比cell.postImageView的边界大得多,因此主线程上的赋​​值需要相当长的时间来缩小它。假设postImageView的边界是可预见的,在后台线程中将图像缩放到正确的大小将很可能将其排除。如果您没有方便的调整大小功能,this gist looks reasonable

答案 1 :(得分:0)

尝试打破你的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
        }
    }
})