我有一个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()
中预先加载图片,然后根据需要插入图片,但这对记忆来说是一个灾难性的想法。
答案 0 :(得分:1)
我确实相信这是因为你正在更新基于重用机制返回的完全相同的单元格的itemImage ...因此每次显示一个新单元格时,你最终会进行后台下载,然后 - 一旦完成 - 更新重用堆栈中的一个单元格等。
您应该根据行号添加额外的级别来填充图像数组,并在更新单元格之前查看该行是否仍在屏幕上,并使用您已获得的图像(如果有) - 一旦出现新单元格屏幕。