2 Stimmen

Wann ist die richtige Zeit, den Datenquellen für ein UITableViewController zu ändern

Nachdem ich eine UITableView mit einer bestimmten Datenquelle gerendert habe, möchte ich in der Lage sein, vor dem Aufruf von reloadData zu einer anderen zu wechseln.

Habe versucht, dies in der Methode

- (void)viewDidAppear:(BOOL)animated);

zu tun, aber soweit ich sehen kann, wird diese Methode nicht aufgerufen, wenn alle sichtbaren Zellen gerendert sind. Wenn ich einen Haltepunkt setze, scheint es, als ob nichts tatsächlich gerendert wird. Also muss ich ihren tatsächlichen Zweck falsch verstanden haben.

Gibt es einen API-Rückruf dafür oder muss ich programmatisch danach suchen? Zum Beispiel in

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

wenn der indexPath den Index für die letzte gerenderte Zelle in der Tabelle enthält.

Um es in Perspektive zu setzen (etwas).

Angenommen, wir haben eine UITableView mit einer "statischen" Datenquelle. Sobald alle statischen Daten angezeigt werden, möchten Sie zu einer dynamischen Datenquelle wechseln, die die Daten aus dem Internet abruft und jede Zeile nach dem Abrufen neu lädt.

Also suche ich eigentlich nach dem "richtigen Anknüpfungspunkt", an dem dieser Wechsel von einer Datenquelle zur anderen gemacht werden soll.

Gibt es noch andere Dinge, über die man besorgt sein sollte?

Weitere Klarstellung. Ich habe den erforderlichen Code geschrieben (z. B. einen UITableViewController mit den initialisierten statischen Daten, verschiedenen Datenquellen, Hintergrundthreads für die dynamischen Ansichten, einen Delegierten, um den UITableViewController darüber zu informieren, wenn neue Daten eintreffen), was ich noch nicht herausgefunden habe (worum es in der Frage geht), ist wann tatsächlich der Wechsel von einer Datenquelle zur nächsten erfolgen soll.

3voto

luvieere Punkte 36219

Wenn Sie reloadData aufrufen, zwingt es Ihre UITableView, Ihre Datenquelle erneut abzufragen, unabhängig von der bereits geladenen Datenmenge. Außerdem werden die Zellen, die nicht sichtbar sind, nicht geladen, sodass praktisch nur die letzte Zelle mit Daten gefüllt wird, wenn Sie zu ihr nach unten scrollen. Wenn Sie sicher wissen, dass alle Ihre Zellen gleichzeitig sichtbar sind, wie es bei einer kleinen Anzahl von ihnen der Fall sein könnte, könnten Sie wie vorgeschlagen vorgehen und Ihre Aktualisierungsfunktion aufrufen, wenn der indexPath den Index für die letzte Zelle in der Tabelle enthält.

Bearbeiten:

Anhand Ihrer Änderungen überlege ich, dass der Zeitpunkt, zu dem Sie die Datenquellen wechseln sollten, vom Zustand Ihrer "live" Daten abhängt - wenn Sie genügend Daten darin haben, um genug davon auf dem Bildschirm anzeigen zu können. Lassen Sie also die statischen Daten angezeigt werden und wechseln Sie nur dann, wenn Sie bereits eine Anzahl von Werten in Ihrer Live-Datenquelle abgerufen haben.
Eine andere Idee könnte sein, nur eine veränderbare Datenquelle zu behalten, mit vorab geladenen statischen Anfangsdaten. Wenn Sie neue "Live"-Werte abrufen, beginnen Sie damit, diejenigen zu ersetzen, die Sie bereits haben, und fahren dann fort, neue Werte hinzuzufügen, wenn ihre Anzahl die ursprüngliche Anzahl statischer Einträge überschreitet.

1voto

ViewDidAppear handelt ausschließlich vom View Controller, nicht von der Tabelle. Das Neuladen der Tabelle wird niemals diese Methode aufrufen.

Was du tun möchtest, wird am besten entweder über einen Delegatenansatz oder die Verwendung von Benachrichtigungen gehandhabt. Richte das statische Datenset in viewDidLoad ein, starte aber sofort den Hintergrund-Datenaustausch. Wenn dieser Austausch abgeschlossen ist, lass den Code, der die neuen Daten herunterlädt, entweder als Delegaten aufrufen oder eine Benachrichtigung an den View Controller senden, dem die Tabelle zuhört, und setze die Tabelle zurück - dann kannst du einfach reloadData aufrufen und die cellForRow:AtIndexPath: Methode wird wieder für die angezeigten Zeilen aufgerufen (reloadData wird auch wieder an den Anfang der Tabelle zurückkehren).

0voto

Björn Punkte 28353

UITableView lädt die Zellen träge, das bedeutet, es lädt nur die Zellen, die für den Benutzer sichtbar sind. Wenn der Benutzer nach unten scrollt, lädt die Tabelle die neuen Zellen, während die "alten" Zellen freigegeben werden. Es gibt Möglichkeiten, die gesamte Datenquelle zu laden, aber dies wird von Apple nicht empfohlen, da es die Speicherbelastung des iPhones erhöhen würde.

viewDidAppear() ist wahrscheinlich die beste Option.

0voto

Alfonso Punkte 8256

Die Methoden viewWillAppear: und viewDidAppear: werden nur aufgerufen, wenn Ihr UIViewController auf dem Bildschirm angezeigt wird (z. B. von einem UINavigationContoller oder UITableViewController).

Was ich in Ihrer Situation tun würde, ist, eine Methode in Ihrem eigenen View-Controller aufzurufen, wenn Ihre dynamische Datenquelle bereit ist (oder wann immer Sie die Datenquelle ändern möchten). Setzen Sie in dieser Methode die Datenquelle und rufen Sie dann [[self tableView] reloadData];

Worauf Sie achten sollten, ist, falls Sie Ihre dynamische Datenquelle im Hintergrund konstruieren (was ich vermute), dass Sie Ihre Methode im Hauptthread aufrufen müssen, indem Sie performSelectorOnMainThread: verwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X