2009-07-04 6 views
2

Ich habe eine UITableView, die eine lange Liste von Daten anzeigen. Verwenden Sie Abschnitte und folgen Sie der Suggestion von How to solve slow scrolling in UITableView.Langsames Laden von UITableView. Woher weißt du warum?

Der Fluss ist ein Haupt UITableView laden & drücken Sie eine Sekunde eine Zeile von dort auswählen.

Allerdings, mit 3000 Elementen dauert 11 Sekunden zu zeigen. Ich vermute zuerst von der Belastung der Datensätze von sqlite (ich lade die ersten 200 vor). Also habe ich es auf nur 50 geschnitten.

Egal ob ich nur 1 oder 500 vorlade, ist die Zeit gleich.

Die Ansicht ist aus IB und alles ist undurchsichtig.

Ich habe keine Ideen mehr, wie das Problem erkannt wird. Ich lasse das Instrument-Tool laufen, weiß aber nicht, was ich suchen soll.

Auch wenn der Benutzer eine Zelle aus dem vorherigen UITable auswählt, wird keine visuelle Rückmeldung angezeigt (dh: die Zelle wird nicht ausgewählt), also denkt er, dass er sie nicht auswählt und mehrmals versucht. Ist mit diesem Problem verbunden.

Was ist zu tun?

HINWEIS: Das Problem ist nur in dem eigentlichen Gerät:

  • iPod Touch 2d Generation
  • Mit FMDB als SQLite api
  • tun das Caching in viewDidLoad
  • Mit NSDictionary für das Caching
  • Verwenden eines NSAutoreleasePool für den Caching-Teil.
  • Nur die Zeilen-ID-Cachen & mac 4 Felder necesary die Zellendaten
  • UIView mit Interface Builder gemacht zu zeigen, SDK 2.2.1
  • Instruments sagen, dass ich 2,5 MB in dem Gerät verwenden
+0

Ich nehme einen zweiten Blick in Instrumente und der teuerste Anruf ist fmresultset next (aus fdbm Bibliothek) – mamcx

+0

Haben Sie analysiert, wie lange es dauert, um die SQL-Abfrage, die die Daten abruft, durchzuführen? – teabot

+0

Keine Ahnung wie. Ich benutze SQL Server vorher und weiß über die Verwendung von Tools für diese, aber nicht für sqlite – mamcx

Antwort

2

Die - Der Aufruf [FMResultSet next] kann je nach Daten, die geladen werden, sehr teuer sein. Während dieses Aufrufs geht sqlite tatsächlich zur Datenbank, findet die nächste Zeile und gibt Ihnen die entsprechenden Felder zurück. Es ist nicht nur ein Enumerator.

Sie sollten in Betracht ziehen, alle Daten vor dem eigentlichen Caching zu speichern, bevor Sie die Tabelle tatsächlich anzeigen. Dies bedeutet, dass Sie alle Ihre FMDB-Aufrufe ausführen würden, bevor die Tabelle auf dem Bildschirm angezeigt wird.

Wenn dies zu lange dauert, möchten Sie möglicherweise die Tabellenansicht mit den ersten Zeilen anzeigen und dann NSOperations oder nur einen zweiten Thread verwenden, um die Daten im Hintergrund zu laden und auf diese Weise zwischenzuspeichern.

+0

Ok, ich cache bereits die ersten 200 Datensätze, aber ich muss alle ID laden, so viel nicht. Wie funktioniert das im Hintergrund? – mamcx

+0

haben Sie eine Methode in Ihrem TableViewController, die alles in Ihren Cache lädt, dann rufen Sie [NSThread detachThreadSelector: @selector (myCachingMethod) toTarget: self withObject: nil]; Plus, vergessen Sie nicht, tatsächlich den Cache zu verwenden * –

+0

Ok, aber leider habe ich Threading Probleme :(Ich weiß nicht, wie sqlite mit beiden Laufflächen verwenden. Vielleicht anoter SO Frage ... – mamcx

0

Ohne Code zu sehen, denke ich, würde ich denken, dass Sie Ihre Tabellen indexieren müssen.

Sie sollten eine enorme Beschleunigung feststellen, wenn Sie einen Index für die Attribute hinzufügen, die Sie abfragen. Sie können dies tun, indem Sie den SQL-Befehl CREATE INDEX verwenden.

Verwandte Themen