在UITableView图像上慢速滚动

时间:2013-01-31 15:53:30

标签: ios objective-c image performance uitableview

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

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

你知道如何提高表现吗?

3 个答案:

答案 0 :(得分:5)

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

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

2)在后台功能中使用imagewithContents文件加载从应用程序包或本地文件存储的图像。

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/////

这将动态加载所有图像,并且比以前的慢速和不稳定行为更平滑地滚动表格视图。

一切顺利

答案 1 :(得分:1)

您可以阅读我刚才提交的答案:

Loading image from CoreData at cellForRowAtIndexPath slows down scrolling

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

答案 2 :(得分:0)

我从你的问题中理解的是,你的图像都已经设置好了,它们被加载到RAM中(存储在一个填充在viewDidLoad中的数组中)。在这种情况下,我想看看cellForRowAtIndexPath中的确切代码以帮助。我的直觉告诉我,那里正在做的事情不应该在主线程上完成(正如他所建议的那样)。问题是 - 如果它只是从NSArray中获取(最坏情况为O(log(n))),那么你不应该看到性能损失。

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