2011-01-06 17 views
1

Ich habe ein scrollendes Raster von Fotos, das so aussieht und funktioniert wie der Foto-Picker auf dem iPhone. Es wird aus einer UITableView erstellt, die eine benutzerdefinierte UITableViewCell verwendet, die eine Reihe von Fotos anzeigt (sehr ähnlich wie Three20 es implementiert).Verbessern Sie die UITableView Scroll-Leistung beim Laden von Bildern

Es funktioniert gut, außer dass Scroll-Leistung ist schlecht. Ich befolge bereits die meisten Best Practices für schnelles UITableView-Scrollen (à la Tweetie).

Die Bilder sind alle mit der App gebündelt. Ich lade sie bei Bedarf auf dem UI-Thread. Ich nutze imageNamed von UIImage: Damit werden die Bilder nach dem ersten Laden zwischengespeichert. Sobald ich einmal durch die Tabellenansicht gescrollt habe, scrollt es sehr flüssig.

Das Problem ist, das erste Scrollen durch die Tabellenansicht, Scrolling ist nervös. Ich habe die App profiliert und festgestellt, dass die meiste Zeit damit verbracht wird, die Bilder aus dem Dateisystem zu laden. Sie sind JPEG-Bilder, bereits korrekt (klein). Ich habe versucht, stattdessen PNG-Bilder zu verwenden, aber die Leistung verbessert sich nicht sehr.

Der iPhone Photo Picker weist eine viel bessere Ladeleistung auf. Ich frage mich, ob das Kombinieren aller Fotos zu einem einzelnen Bild, das ich einmal lade und dann in kleinere Bilder aufspalte, schneller wäre. Es funktioniert sicherlich in Spielen, aber ich weiß, das ist wirklich eine ganz andere Geschichte. Hat jemand Erfahrung damit gemacht?

Weitere Ideen, wie ich die Leistung verbessern kann?

Übrigens habe ich ein ähnliches, wenn auch weniger Leistungsproblem für ein anderes UITableView, das nur Standard-UITableViewCells mit einem Bild verwendet, das dem ImageView pro Zeile zugewiesen ist.

Antwort

2

Eine Sache zu versuchen könnte sein, alle Bilder vor-Caching, wenn die Ansicht lädt. Darüber hinaus laden Sie die Bilder möglicherweise in den Hintergrund (obwohl sie aus dem Dateisystem und nicht aus dem Web geladen werden). Ich habe das selbst nicht versucht, aber vielleicht könnten Sie etwas wie https://github.com/rs/SDWebImage verwenden und die URLs auf das Dateisystem zeigen lassen. Benutzer sehen zunächst einige Platzhalterbilder, aber die Benutzeroberfläche würde beim Laden der Bilder nicht stottern.

+0

Ich habe beide Techniken ausprobiert: Pre-Caching und Async-Laden. Das Async-Laden sah schrecklich aus, da die Bilder alle so schnell laden, aber langsam genug für ein auffälliges Flimmern. Pre-Caching hat super funktioniert. Ich mache mir Sorgen darüber, was passiert, wenn ich in ein paar Monaten 350 Bilder vorcachen muss (ich muss derzeit nur 100 vorcachen), aber ich werde diese Brücke überqueren, wenn ich dazu komme. Danke für die tolle Antwort. –

+1

Gern geschehen! Beim asynchronen Laden sieht es möglicherweise besser aus, wenn Sie kein Platzhalterbild haben, sondern nur einen leeren Bereich, in dem das Bild angezeigt wird.Das könnte das Flackern verhindern. –

0

Ich hatte ein ähnliches Problem mit einem UITableView zum Anzeigen von Informationen aus einem RSS-Feed analysiert. Ich hatte Probleme mit Scrolling-Performances, wenn eine erhebliche Menge an Daten vorhanden war. Obwohl ich immer noch daran arbeite, suspendiere ich das Parsing, wenn die Tabelle gescrollt wird. Es wird fortgesetzt, wenn das Scrollen stoppt. Ich bin nicht an meinem Computer, aber ich glaube, ich habe tableViewDidScroll und tableViewDidEndDecelerating verwendet. Sie können diese Delegierten für die Tabellenansicht überprüfen. Auf jeden Fall funktioniert es sehr gut, ich brauche nur eine elegantere Art, mein Parsing anzuhalten.

+0

Joe, wenn Sie den RSS-Feed in einem Hintergrund-Thread analysieren, versuchen Sie, die Thread-Priorität auf 0 zu setzen (setzen Sie dies am Anfang des Hintergrund-Thread-Codes: '[NSThread setThreadPriority: 0]'). Ich fand das sehr gut für mich, und es könnte Ihr Problem auch eleganter lösen. –

-1

Fantastisch. Das funktioniert wie ein Zauber! So effizient endete ich mit insertRowAtIndexPath anstatt die Tabelle neu zu laden. Jetzt verhält es sich wie es

Vielen Dank! Joe

0

Wenn Sie die PagingEnabled-Eigenschaft auf off setzen, wird die Bildlaufleistung verbessert.

Verwandte Themen