2016-12-14 45 views
0

我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。

感谢您有兴趣在这一问题。任何想法将非常感激!

回答

1

肯定有访问和手动更新小区查看内容,并呼吁全收认为,你可以尝试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]) 
      } 
     } 
    } 
} 
+0

谢谢您的回答!这可以使所有图像显示在正确的单元格中。但事情现在第一次滚动变成了生涩的......我想知道是否有办法获得更新的正确单元格? –

+0

不用担心!嗯,不知道更多关于你的应用程序如何工作,我不知道!您可能需要使用工具来查看在滚动时阻塞主线程的确切内容。以防万一你不这样做,只需在后台线程上创建一个'UIImage'就不会将图像解码到内存中;当图像视图出现在屏幕上时,这会发生懒惰。这通常会导致大多数滚动视图滞后。有很多关于如何明确强制'UIImage'在后台提前解码的时间做题:http://stackoverflow.com/questions/3904575/decode-images-in-background-thread – TiM

+0

还有一个很多优化工作,你可以在一般做些什么来改善性能滚动:https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.t8tw7ojhp – TiM