我有一个 CollectionView
,它使用高质量图像显示项目列表。为了提高滚动时的性能,我植入了以下代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
var image = UIImage(data: item.image_data as! NSData)
UIGraphicsBeginImageContextWithOptions(image!.size, true, 0);
image?.drawAtPoint(CGPointZero)
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), { () -> Void in
cell.itemImage.image = image
})
})
这消除了滚动带来的所有滞后,但导致了一个新问题 - 如果我快速滚动说 100 个项目,我着陆的单元格可能会更改图像 5-6 次,然后停留在该项目的正确图像上。我猜这只是 collectionView
的追赶。
所以我需要尽可能快地平滑滚动和正确显示图像。两全其美的最有效方法是什么?
我尝试在 viewDidLoad()
中预加载图像,然后根据需要将其插入,但事实证明这对内存来说是一个灾难性的想法。
最佳答案
我确实相信这是因为您正在更新基于重用机制返回的完全相同单元格的 itemImage...因此每次显示新单元格时,您最终都会进行后台下载,然后 - 一旦完成 -更新重用堆栈中的一个单元等。
您应该添加一个额外的级别以根据行号填充图像数组,并在更新单元格并使用您已经获得的图像(如果有的话)之前查看该行是否仍在屏幕上 - 一旦新单元格出现在屏幕。
关于ios - 滚动单元格后如何更快地设置 UICollectionViewCell 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084168/