2010-12-27 13 views
0

Ich versuche mit Online-Daten in meiner iPhone App zu arbeiten. Aber ich bin verrückt wegen dieser:UITableView reloaddata lädt nicht sofort

Ich habe ein Objekt zum Herunterladen von Daten mit NSURLConnection. Methode startet die Arbeit mit Verbindung (und anderen Sachen) in separaten Thread - [ NSThread detachNewThreadSelector:@selector(doConnectionInNewThread) toTarget: self withObject: nil ];

Wenn Daten geladen sind (connectionDidFinishLoading) Ich gebe sie an meine ViewController. Das alles funktioniert gut. Wenn ich Breakpoints oder NSLog verwende, sind die Daten in UITableView verfügbar. Wenn ich reloadData aufruft, passiert nichts sofort. Es lädt Daten nach vielleicht 2 Sekunden neu (- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath wird nach dieser Verzögerung aufgerufen).

ABER wenn ich die TableView verschiebe, lädt es Daten sofort neu. So funktioniert die Verbindung und so weiter, aber es lädt die Daten einfach nicht neu. Warum? Ich dachte es könnte daran liegen, dass mainThread von URLConnection blockiert wird. Aber jetzt benutze ich es in einem separaten Thread und es ist immer noch das gleiche ...

Antwort

2

Zugriff auf Ihre Tabellenansicht im gelöschten Thread?

Stellen Sie sicher, die Benutzeroberfläche auf dem Haupt-Thread aktualisieren mit:

-performSelectorOnMainThread: withobject: waitUntilDone:

+0

hm. So, jetzt ich meine Objektfunktion mit Verbindungsstopfen normalerweise (in keinem abgetrennten Thread) aber wenn ich alle benötigten Daten bekomme ich rufe "-performSelectorOnMainThread: withObject: waitUntilDone:" um meine ViewController zu reloadData zu informieren und es funktioniert perfekt. Vielen Dank! Was ist der Trick? Der Name sagt etwas wie "mach das auf mainThread ohne Geduld". Also stoppt es die vorherige URLConnection oder was? – D33

+0

Der Zugriff auf die UI-Statusmaschine auf einem Nicht-Haupt-Thread wird im Allgemeinen nicht unterstützt. Insbesondere markiert reloadData die Tabellenansicht als Anzeige, um die Daten neu zu laden (dh das Neuladen von Daten ist faul). Da Sie nicht im Hauptthread sind, ist die Anzeigeplanung wahrscheinlich falsch. – Julien

+0

Sie dürfen auch nicht die gleiche Sammlung (veränderbares Array oder Dictionary) manipulieren, die Sie verwenden, wenn Sie die Daten aus Ihrem Hintergrund-Thread anzeigen, zumindest nicht ohne entsprechendes Sperren. Sie können einem NSMutableArray oder NSMutableDictionary keine Objekte aus einem Thread hinzufügen, während Sie in einem anderen Thread davon lesen. –

Verwandte Themen