CollectionView Problem mit UIImage / UIImageview

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CollectionView Problem mit UIImage / UIImageview

    Moin zusammen,

    nachdem ich in meiner App viele Tableviews verwende, dachte ich warum nicht mal ein wenig Abwechslung.
    Also habe ich mir die Collectionviews einmal angesehen. Der Aufbau ist nach ein bisschen Einarbeitung gelungen.

    Jetzt gibts hier aber ein mysteriöses Bildflackern was ich irgendwie nicht in den Griff bekomme.

    Quellcode

    1. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    2. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CollectionViewCellDemo
    3. var imageUrlString = ""
    4. // BILD URL PRÜFEN UND KORRIGIEREN
    5. let imageUrlDB = datastructarray[(indexPath as NSIndexPath).item].imageUrl as String
    6. if(imageUrlDB == "none.png"){
    7. imageUrlString = "https://images.webserver.de/"+imageUrlDB
    8. }else if(imageUrlDB as String == ""){
    9. imageUrlString = "https://images.webserver.de/none.png"
    10. }else{
    11. imageUrlString = imageUrlDB
    12. }
    13. // CHECK OB BILD DOWNLOADBAR
    14. if let url = URL(string: imageUrlString) {
    15. if (try? Data(contentsOf: url)) != nil {
    16. }else{
    17. imageUrlString = "https://images.webserver.de/none.png"
    18. }
    19. }
    20. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    21. let imageUrl: URL = URL(string: imageUrlString)!
    22. let imageData: Data = try! Data(contentsOf: imageUrl)
    23. let imageview: UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 165, height: 162))
    24. let image: UIImage = UIImage(data: imageData)!
    25. //imageview.image = nil
    26. imageview.image = image
    27. DispatchQueue.main.async {
    28. cell.contentView.addSubview(imageview)
    29. }
    30. }
    31. return cell
    32. }
    Alles anzeigen



    Immer wenn ich eine Cell anklicke, dann in den anderen ViewController komme, und von diesem durch:

    Quellcode

    1. dismiss(animated: true, completion: nil)

    zurück zum Collectionview komme, werden die Bilder natürlich neu geladen und dann habe ich z.B. das Bild der letzten Cell
    für eine Sekunde oben links in der 1. Cell. Natürlich sortiert sich alles wieder richtig, aber es sieht einfach total blöd aus.

    Das erste Füllen und updaten der Collectionview mache ich hier:

    Quellcode

    1. override func viewWillAppear(_ animated: Bool) {
    2. let uid = 1234
    3. datastructarray = [datastruct]()
    4. updateCollectionsView(uid!, lid: lid)
    5. }
    Was mir jetzt schon etwas komisch vorkommt, ist die Tatsache, dass die Collectionview-Funktion die die Cells baut, ja bei jedem
    Scrollen erneut ausgeführt wird. Das bedeutet dann ja, dass auch die Bilder permanent neu geladen werden oder? Ist das so richtig?

    Wie würdet ihr diesen Aufbau machen? Habt ihr einen Tip für mich? Vielen Dank!

    Viele Grüße
    David
  • macmoonshine schrieb:

    Du kannst und solltest die Bilder zwischenspeichern. Dazu kannst du beispielsweise die Bilddaten im Dateisystem ablegen.
    Ja das hatte ich schon irgendwo bei Stackoverflow zwischendurch gelesen, allerdings ist mir nicht ganz klar, wie Bilder zwischenspeichernd kann.

    Es gibt da wohl auch Caching Tools die man importieren kann, aber bevor ich noch ein Framework einbinde dachte ich ich frag erstmal hier die Profis
    nach anderen Möglichkeiten.

    Kannst du mir da weiterhelfen?
  • macmoonshine schrieb:

    Du lädst das Bild ja als NSData-Objekt, und die speichern sich ja quasi von alleine. ;)

    Übrigens lädst du die Daten synchron. Das ist generell eine schlechte und speziell für Bilder im Collect-/Tableview eine sehr bescheidene Idee.

    gandhi schrieb:

    macmoonshine schrieb:

    Übrigens lädst du die Daten synchron.
    Und nicht nur das. Die werden sogar doppelt geladen. In Zeile 17 lädst Du den Bildinhalt nur um festzustellen, ob der Bildinhalt ladbar ist und wirfst das Ergebnis (=Bildinhalt) wieder weg um ihn in Zeile 24 nochmal zu laden ;( Warum?
    Oh, Tatsache, ihr habt recht. Das muss ich dringend ändern. Danke !