UICollectionView负荷的形象不能得到正确的细胞迅速的3个
问题描述:
我UICollectionView是获取图像cellForItemAt
。升级到swift 3后,当我滚动速度非常快时,某些图像不显示。这是我在cellForItemAt
代码:UICollectionView负荷的形象不能得到正确的细胞迅速的3个
if (imageNotInCache) {
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
if let thumb = imageFromPathAndCacheIt(path) {
DispatchQueue.main.async {
let updateCell = collectionView.cellForItem(at: indexPath) as! MyCustomCell? {
updateCell.imageView.image = thumb
}
}
}
的问题是,有时我得到updateCell
作为零,甚至是屏幕上(可能因为滚动快)。
我知道我们可以在添加图片后添加reloadData
,就像:Swift 3: Caching images in a collectionView,但我不想多次调用reload。
感谢您有兴趣在这一问题。任何想法将非常感激!
答
肯定有访问和手动更新小区查看内容,并呼吁全收认为,你可以尝试reloadData
之间的妥协。
您可以使用func reloadItems(at: [IndexPath])
请求UICollectionView
重新加载单个单元格,如果它在屏幕上。
据推测,imageNotInCache
意味着你存储image
在内存中缓存,所以只要image
也是由func collectionView(UICollectionView, cellForItemAt: IndexPath)
访问,下面应该“只是工作”:
if (imageNotInCache) {
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
if let thumb = imageFromPathAndCacheIt(path) {
DispatchQueue.main.async {
self.collectionView.reloadItems(at: [indexPath])
}
}
}
}
谢谢您的回答!这可以使所有图像显示在正确的单元格中。但事情现在第一次滚动变成了生涩的......我想知道是否有办法获得更新的正确单元格? –
不用担心!嗯,不知道更多关于你的应用程序如何工作,我不知道!您可能需要使用工具来查看在滚动时阻塞主线程的确切内容。以防万一你不这样做,只需在后台线程上创建一个'UIImage'就不会将图像解码到内存中;当图像视图出现在屏幕上时,这会发生懒惰。这通常会导致大多数滚动视图滞后。有很多关于如何明确强制'UIImage'在后台提前解码的时间做题:http://stackoverflow.com/questions/3904575/decode-images-in-background-thread – TiM
还有一个很多优化工作,你可以在一般做些什么来改善性能滚动:https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.t8tw7ojhp – TiM