2016-12-14 7 views
0

Meine UICollectionView ruft Bilder in cellForItemAt ab. Nachdem ich auf swift 3 aktualisiert habe, werden einige Bilder nicht angezeigt, wenn ich sehr schnell blättern kann. Hier ist mein Code in cellForItemAt:UICollectionView Ladebild kann nicht korrekt gesendet werden. Swift 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 
      } 
    } 
} 

Das Problem ist, manchmal bekomme ich updateCell als null sogar auf dem Bildschirm ist (wahrscheinlich, weil blättern zu schnell).

Ich weiß, wir können hinzufügen reloadData nach dem Hinzufügen des Bildes, genau wie: Swift 3: Caching images in a collectionView, aber ich möchte nicht so oft neu laden aufrufen.

Vielen Dank für Ihr Interesse an dieser Frage. Irgendwelche Ideen würden sehr geschätzt werden!

Antwort

1

Es gibt definitiv einen Kompromiss zwischen dem Zugriff und dem manuellen Aktualisieren des Zellenansichtsinhalts und dem Aufruf von reloadData für die gesamte Auflistungsansicht, die Sie ausprobieren könnten.

Mit der func reloadItems(at: [IndexPath]) können Sie die UICollectionView bitten, eine einzelne Zelle neu zu laden, wenn sie auf dem Bildschirm angezeigt wird.

Vermutlich imageNotInCache bedeutet, dass Sie image in einer In-Memory-Cache speichern, so lange, wie image durch die func collectionView(UICollectionView, cellForItemAt: IndexPath) auch zugänglich ist, sollte folgende "einfach funktionieren":

if (imageNotInCache) { 
    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     if let thumb = imageFromPathAndCacheIt(path) { 
      DispatchQueue.main.async { 
       self.collectionView.reloadItems(at: [indexPath]) 
      } 
     } 
    } 
} 
+0

Vielen Dank für Ihre Antwort ! Dies kann dazu führen, dass alle Bilder in korrekten Zellen angezeigt werden. Aber das Ding scrollt jetzt zum ersten Mal ruckelt ... Ich frage mich, ob es einen Weg gibt, einfach die richtige Zelle zum Update zu bekommen? –

+0

Keine Sorge! Hmm, ohne zu wissen, wie deine App funktioniert, bin ich mir nicht sicher! Möglicherweise müssen Sie Instrumente verwenden, um genau zu sehen, was den Haupt-Thread beim Scrollen blockiert. Nur für den Fall, dass Sie das nicht tun, wird das Bild einfach durch Erstellen eines 'UIImage' auf einem Hintergrund-Thread nicht in den Speicher decodiert. das passiert träge, wenn die Bildansicht auf dem Bildschirm erscheint. Dies kann in der Regel die meisten Bildlaufverzögerungen verursachen. Es gibt eine Menge Fragen zu SO darüber, wie man ein 'UIImage' explizit dazu zwingen kann, im Hintergrund vorher zu dekodieren: http://stackoverflow.com/questions/3904575/decode-images-in-background-thread – TiM

+0

Es gibt auch ein Viele Optimierungen, die Sie im Allgemeinen durchführen können, um die Scroll-Leistung zu verbessern: https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-guidney-fd609d5275a5#.t8tw7ojhp – TiM

Verwandte Themen