ios - 滚动单元格后如何更快地设置 UICollectionViewCell 图像?

标签 ios swift uiimageview uicollectionview

我有一个 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/

相关文章:

IOS:编程 rootViewController 以不同方式呈现 View 到 Storyboard 'isInitialView'

ios - 如何通过 panGestureRecognizer 启用 collectionView 分页

swift - 在 Swift 中使用 NSMutableArray sortUsingFunction?

swift - 使用 Firebase 的 OAuth 问题通过 Facebook 登录(input_token 中的 App_id 与查看应用程序不匹配)

ios - 尝试添加图层蒙版时 UIImage 消失

ios - 直接从 AFNetworking 获取 NSData,而不是让它转换为 UIImage

ios - 如何在应用程序处于非事件状态时获取推送通知 ios swift3

ios - 如何在iOS中实现自动滑动iCarousel?

ios - 更改 UIImageview 形状矩形的默认形状

iphone - 过滤单击和双击