2017-02-06 2 views
0

Ich habe eine UITableView in meinem ViewController. Um es zu füllen, muss ich eine async Anfrage machen, die bis zu einer Sekunde dauern kann, um abzuschließen. Wo soll ich es hinstellen?Wo ist der richtige Platz zum Auffüllen von UITableView?

Als ich versuchte, ViewDidLoad async zu machen und einen Anruf von dort zu machen, ViewWillLayoutSubviews wirft einen Fehler, weil es einige Elemente zu positionieren versucht, die noch nicht zugeordnet wurden - aufgrund der Tatsache, dass nicht alle Code aus ViewDidLoad noch ausgeführt wurden (Ich denke).

+0

Nachdem Sie Daten abgerufen haben, was werden Sie tun? Aktualisieren Sie beispielsweise die Benutzeroberfläche. – Lumialxk

+0

Ja, ich werde '_tableView.Source = ...; _tableView.ReloadData(); ' – nicks

Antwort

2

ausprobieren Bevor Sie irgendetwas in ViewDidLoad erwarten, müssen Sie alle Ihre Ansicht Logik einrichten. Andernfalls wird Ihre Ansichtsinitialisierung nicht beendet, wenn die Methode ViewDidLoad zurückgibt. Das könnte eine mögliche Ursache für das Fehlschlagen von ViewWillLayoutSubviews sein. Wenn es immer noch fehlschlägt, verwenden Sie einen Versuch/Catch, um sicherzustellen, dass Ihr Dienst funktioniert:

+0

okay. aber warum 'Task.Run' und' InvokeOnMainThread', anstatt 'ViewDidLoad'' async' zu machen und von dort 'wartbare' Anfragen zu stellen? – nicks

+0

Grundsätzlich, weil ViewDidLoad eine Methode ist, die von iOS definiert und aufgerufen wird und nicht asynchron ist. Es in C# asynchron zu machen bedeutet nicht, dass iOS darauf warten wird. Deshalb könnte 'ViewWillLayoutSubviews' fehlschlagen – xleon

+0

könnten Sie die Quelle für diese Information zur Verfügung stellen? – nicks

0

Versuchen Sie, die tableView.ReloadData(); Methode innerhalb

dispatch_async (dispatch_get_main_queue()^{} dies Ihr Problem lösen könnte

-. Als allgemeine Regel gilt, sollten Sie versuchen, um sicherzustellen, dass alle Ihre UI Interaktion geschieht auf dem Haupt-Thread. Und Aufgabe Ihre Daten holen im Hintergrund arbeiten. Es sah aus wie Sie reload-Daten von Ihrem Hintergrund-Thread aufrufen wurden, die.

0

auf dem Daten Je würde ich in der legte den Anruf riskant scheint AppDelegate. Wenn die App gestartet wird, sollten die Daten abgerufen und gespeichert werden.

Wenn Ihr UITableview erscheint, wird es bereits die Daten bereit haben oder vielleicht eine Fehlermeldung, da Sie das Ergebnis des Abrufs bereits kennen.

Die Daten können sich ändern das ist der Grund, warum ich den Abruf holen auch in viewWillAppear() von Ihrem ViewController mit der setzen würde.

ViewDidLoad() ist eine Methode, die nur einmal aufgerufen wird. Außerdem wird es als erste Methode des ViewController-Lebenszyklus bezeichnet. Es wäre gut, wenn Sie ein wenig darüber lesen VC lifecycle. Sie können sich selbst helfen, indem Sie es mit printf("method name").

+0

Ich denke, dass das Abrufen von Daten auf AppDelegate wirklich schwierig ist, es sei denn, Sie benötigen es für die App-Initialisierung. Stellen Sie sich vor, Sie haben 20 View-Controller, von denen jeder asynchrone Anfragen stellt. Würden Sie alle diese Anfragen in AppDelegate machen? – xleon

+0

Ich stimme dir zu @xleon. Ich kenne sein Anwendungsszenario nicht. Ich würde es nur tun, wenn ich es für App-Init benötige, wie du es erwähnt hast, oder wenn die Daten wichtig sind, sich aber ändern können, wenn der Benutzer die App nicht benutzt. – Darkwonder

Verwandte Themen