2016-12-14 69 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