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

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

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

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

【问题讨论】:

    标签: ios objective-c image performance uitableview


    【解决方案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 压缩),问题就会消失。我会看看你的文章。谢谢!
    • 快速提示:使用不大于显示所需的图像尺寸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多