我正在显示直接从我的应用程序加载的大量图像(未下载)。第一次滚动时我的表视图很慢。显示所有单元格后,它变得平滑。我真的不知道为什么。
我有一个UIImage数组,我正在viewDidLoad中加载。然后在我的tableview委托中,我只是在给定的索引路径上获取图像并将其设置为我单元格的UIImageView。
你知道如何提高表现吗?
答案 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。