Schlechte UICollectionView Scrolling-Leistung mit UIImage

7

Ich habe eine UICollectionView in meiner App, und jede Zelle ist eine UIImageView und einige Textbeschriftungen. Das Problem ist, dass wenn ich die UIImageViews ihre Bilder anzeigen lasse, die Scroll-Performance schrecklich ist. Es ist bei weitem nicht so flüssig wie das Scroll-Erlebnis eines UITableView oder sogar desselben UICollectionView ohne das UIImageView.

Ich habe diese Frage von vor ein paar Monaten, und es scheint wie eine Antwort gefunden wurde, aber es ist in RubyMotion geschrieben, und ich verstehe das nicht. Ich habe versucht, zu sehen, wie ich es in Xcode umwandeln kann, aber da ich auch nie NSCache benutzt habe, ist es etwas schwierig. Das Poster dort zeigte auch auf here < Ich möchte etwas zusätzlich zu ihrer Lösung implementieren, aber ich bin mir nicht sicher, wo ich diesen Code auch einfügen soll. Möglicherweise, weil ich den Code aus dem erste Frage .

Würde jemand in der Lage sein, dies in Xcode zu übersetzen?

%Vor%

Hier ist der Code von zweite Frage , dass der Fragesteller der erste Frage sagte das Problem gelöst:

%Vor%

Ich bin mir nicht sicher, wie / wo ich das umsetzen soll.

Vielen Dank.

    
Nick 03.04.2013, 22:34
quelle

3 Antworten

19

Hier ist das Muster, dem ich folge. Laden Sie asynch immer und speichern Sie das Ergebnis zwischen. Nehmen Sie keine Annahme über den Status der Ansicht vor, wenn die Asynch-Last abgeschlossen ist. Ich habe eine Klasse, die die Lasten wie folgt vereinfacht:

%Vor%

Jetzt ist die Aktualisierung der Zelle (Sammlung oder Tabelle) ziemlich einfach:

%Vor%     
danh 03.04.2013, 23:02
quelle
5

Im Allgemeinen tritt ein schlechtes Scrollverhalten für UICollectionViews oder UITableViews auf, da die Zellen im Hauptthread von iOS aus der Warteschlange entfernt und konstruiert werden. Es gibt wenig Freiheit, Zellen zu pricazieren oder sie in einem Hintergrund-Thread zu konstruieren, stattdessen werden sie aus der Warteschlange entfernt und so konstruiert, dass Sie blättern und die Benutzeroberfläche blockieren. (Persönlich finde ich dieses schlechte Design von Apple, obwohl es die Dinge vereinfacht, weil Sie sich nicht über potenzielle Threading-Probleme bewusst sein müssen. Ich denke, dass sie einen Haken für eine benutzerdefinierte Implementierung für einen UICollectionViewCell / UITableViewCell-Pool geben sollten kann die Auslagerung / Wiederverwendung von Zellen handhaben.)

Die wichtigsten Ursachen für Leistungseinbußen sind in der Tat auf Bilddaten zurückzuführen und (in abnehmender Größenordnung) sind nach meiner Erfahrung:

  • Synchrone Aufrufe zum Herunterladen von Bilddaten: tun Sie immer asynchron und rufen Sie [UIImageView setImage:] mit dem erstellten Bild auf, wenn es im Haupt-Thread
  • bereit ist
  • Synchrone Aufrufe zum Konstruieren von Bildern aus Daten im lokalen Dateisystem oder aus anderen serialisierten Daten: Führen Sie dies auch asynchron aus. (z. B. [UIImage imageWithContentsOfFile:], [UIImage imageWithData:], usw.).
  • Aufrufe von [UIImage imageNamed:]: Wenn dieses Bild zum ersten Mal geladen wird, wird es aus dem Dateisystem bedient. Vielleicht möchten Sie Bilder vorab cachen (indem Sie einfach [UIImake imageNamed:] laden, bevor die Zelle tatsächlich so konstruiert ist, dass sie stattdessen sofort aus dem Speicher geliefert werden können.
  • Der Aufruf von [UIImageView setImage:] ist ebenfalls nicht die schnellste Methode, kann aber oft nicht vermieden werden, es sei denn, Sie verwenden statische Bilder. Bei statischen Bildern ist es manchmal schneller, verschiedene Bildansichten zu verwenden, die Sie auf ausgeblendet oder nicht eingestellt haben, je nachdem, ob sie angezeigt werden sollen, anstatt das Bild in derselben Bildansicht zu ändern.
  • Wenn eine Zelle zum ersten Mal aus der Warteschlange entfernt wird, wird sie entweder von einem Nib geladen oder mit alloc-init erstellt, und einige ursprüngliche Layouts oder Eigenschaften werden gesetzt (wahrscheinlich auch Bilder, wenn Sie sie benutzt haben). Dies führt bei der ersten Verwendung einer Zelle zu einem schlechten Scrollverhalten.

Da ich beim glatten Scrollen sehr wählerisch bin (auch wenn es nur das erste Mal ist, dass eine Zelle verwendet wird), habe ich ein ganzes Framework erstellt, um Zellen durch Unterklassenbildung von UINib zu priaken (dies ist im Prinzip der einzige Haken, den man beim Auslagerungsprozess von iOS). Aber das könnte über deine Bedürfnisse hinausgehen.

    
Werner Altewischer 29.01.2015 12:42
quelle
0

Ich hatte Probleme mit UICollectionView scrolling.

Was (fast) wie ein Zauber für mich funktionierte: Ich bevölkerte die Zellen mit PNG Thumbnails 90x90. Ich sage fast, weil die erste vollständige Scroll nicht so glatt ist, aber nie mehr abgestürzt ist.

In meinem Fall ist die Zellengröße 90x90.

Ich hatte vorher viele originale PNG-Größen und es war sehr unruhig, wenn png Originalgröße größer als ~ 1000x1000 war (viele Abstürze beim ersten Scrollen).

Also wähle ich 90x90 (oder ähnliches) auf dem UICollectionView und zeige die originalen PNGs (unabhängig von der Größe) an. hoffe, es kann anderen helfen.

    
Paulo Souto 21.12.2013 00:33
quelle