UITableView 图像上的缓慢滚动

Posted

技术标签:

【中文标题】UITableView 图像上的缓慢滚动【英文标题】:Slow scroll on UITableView images 【发布时间】:2013-01-31 15:53:29 【问题描述】:

我正在显示大量直接从我的应用加载的图像(未下载)。第一次滚动时,我的表格视图很慢。在我的所有单元格显示后它变得平滑。我真的不知道为什么。

我在 viewDidLoad 中加载了一组 UIImage。然后在我的 tableview 委托中,我只是在给定的索引路径中获取图像并将其设置为我的单元格的 UIImageView。

你知道我可以如何提高性能吗?

【问题讨论】:

【参考方案1】:

只是为了分享我已经修复并且效果很好我遵循的步骤。

1) 设置 performSelectorInBAckground 函数,将 Cell 作为参数传递,保存滚动视图或 uiview 以放置许多 iamges。

2) 在后台函数中,使用 imagewithContents of file 加载从应用程序包或本地文件中存储的图像。

3) 使用此代码将图像设置为 imageView。

    //// Start of optimisation - for iamges to load dynamically in cell with delay , make sure you call this function in performSelectorinBackground./////

    //Setting nil if any for safety
    imageViewItem.image = nil;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

    dispatch_async(queue, ^
        UIImage *image = // Load from file or Bundle as you want

        dispatch_sync(dispatch_get_main_queue(), ^

            //Set the image to image view not, wither cell.imageview or [cell add subviw:imageview later ]
            [imageViewItem setImage:image];
            [imageViewItem setNeedsLayout];
        );
    );

    //// End of optimisation/////

这将动态加载所有图像,并且与以前的缓慢和生涩的行为相比,滚动表格视图也非常顺畅。

一切顺利

【讨论】:

非常感谢。它运作良好。当我们滚动tableview时,我们可以使用NSCache来存储img以节省内存而不是从远程服务器加载图像。【参考方案2】:

你可以在这里阅读我刚刚提交的答案:

Loading image from CoreData at cellForRowAtIndexPath slows down scrolling

基本思想是使用 Grand Central Despatch 将获取表格视图图像的代码移至单独的线程,并在图像可用时将单元格填充回主线程。即使从文件系统将图像加载到内存中存在延迟,您的滚动也会非常流畅。

【讨论】:

如果我已经在情节提要中加载了我的图像,这会有帮助吗?我有一个项目列表,其中都包含两个图像:删除按钮图像和文本背景。这两个图像对于每一行都是相等的。 @RageCompex - 如果每一行都使用相同的两个图像,你不应该因为图像加载而出现滚动缓慢的问题。如果您的所有资产都是从情节提要加载的,那么同样它们不应阻止滚动(已加载)。如果您仍然看到滚动阻塞,我建议您发布一个更详细的问题。【参考方案3】:

我从您的问题中了解到的是,您的图像都已准备就绪,并且它们已加载到 RAM 中(存储在 viewDidLoad 中填充的数组中)。在这种情况下,我想查看 cellForRowAtIndexPath 中的确切代码以提供帮助。我的直觉告诉我,那里正在做一些不应该在主线程上做的事情(正如他所暗示的那样)。问题是 - 如果它只是从 NSArray 中获取(最坏的情况是 O(log(n))),你不应该看到性能下降。

我知道您没有下载图像,但我仍然建议您在后台线程上执行任何非 UI 操作。我写了something that might help you out。

【讨论】:

我实现了@he-was 方法,但问题仍然存在。但是,如果我减小图像大小(jpg 压缩),问题就会消失。我会看看你的文章。谢谢! 快速提示:使用不大于显示所需的图像尺寸。

以上是关于UITableView 图像上的缓慢滚动的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView在过滤时滚动插入

编辑第一个 UITextField 时,如何将 UITableView 滚动到第二个 UITextField?

UITableView 在旋转时使用自动布局调整大小

UIcollectionView 具有缓慢的图像加载和滚动

如何修复滚动缓慢的表格视图

从 NSData 转换到 UIImage 很慢,阻塞 UITableView