Update UITableView mit threads
Erstelle ich ein Wörterbuch-Anwendung für das iPhone, gibt das Ergebnis, während die Benutzer eingeben. Ich benutze threads (NSThread) zu aktualisieren UITableView, so dass der main-thread nicht blockiert wird.
Jedoch, einem crash passiert, wenn die UITableView fragt die Datenquelle für die Anzahl der Zeilen ( tableView:numberOfRowsInSection:) und ich zurück, sagen wir, 10. Dann fragt es die Daten-Quelle für Zellen 0-9 (tableView:cellForRowAtIndexPath:). Aber durch die Zeit, bittet für die Zelle 7, die Datenquelle hat sich schon geändert, und es hat jetzt nur 5 Zeilen, so dass ein Absturz.
Hier ist, wie ich das problem lösen:
Erstelle ich eine NSLock in der init-Methode.
Und hier ist, was die Datenquelle sieht so aus:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [results count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[lock lock];
if (indexPath.row < [results count]) {
cell.textLabel.text = [results objectAtIndex:indexPath.row];
}
[lock unlock];
return cell;
}
Und hier ist der code, den ich verwenden, um die Tabelle zu aktualisieren:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
Er löst das Absturz problem nicht ganz. Ich denke aber, dass es möglicherweise nicht effizient, da die Datenquelle hat, zu sperren/entsperren jedes mal, wenn er aufgefordert wird, eine Zelle. Und der Fall, dass ich oben erwähnt, passiert nicht oft. Hat jemand eine bessere Idee, wie dieses problem zu lösen effizient?
Vielen Dank!
- Sollten Sie nicht aktualisieren Sie die Benutzeroberfläche in einem anderen thread.
- Rick, ich Suche für das Ergebnis in einem anderen thread, da die Suche-Methode ist ziemlich langsam und ich will nicht, es zu sperren der Haupt-thread. Könnten Sie bitte erklären, wie ich erreichen kann, dass ohne die Verwendung von einem anderen thread?
- machen Sie es schneller. was auf der Erde sind Sie auf der Suche durch?!
- Präfix-Suche anhand von 200.000 non-unique records
- die Indizierung der Sie durch Ihre ersten Buchstaben spart 2log26 Ihres binären Suche Schritte. Die Indizierung der zweite Brief, Blättern Sie mit 300 Datensätzen im Durchschnitt zu Durchlaufen. Muss möglich sein in unter 0,1 Sekunden.
- Jungs, das beantwortet die Frage nicht. Erstens ist er nicht die Aktualisierung der Benutzeroberfläche in einem anderen thread; er nennt performSelectorOnMainThread. Zweitens, einige Anfragen nehmen Sie einfach eine lange Zeit und es ist nichts zu sein getan über es. Ich stehe vor dem gleichen problem mit einer DB Abfrage geschieht über das Internet auf einem Handy. Irgendwann habe ich zu überarbeiten, den Inhalt der Daten sichern der tableview, und die Frage ist, wie um Sie zu verriegeln. Ist NSLock immer noch der beste Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie nicht, die Aktualisierung der Benutzeroberfläche von einem hintergrund-thread. Es wird nicht funktionieren.
Warum würden Sie einen separaten thread für diese? Wie lange hat die Suche gedauert? 0,1 Sekunden? Wie verhält sich dies zu der Zeit, die der Benutzer zum beenden der Eingabe und auf den Bildschirm schauen?
Nicht über die Dinge zu komplizieren! (Ich nehme diese zurück, wenn Sie Ihre Suche dauert mehr als 0,7 Sekunden und kann nicht optimiert werden 😉
struct tree { struct tree *letters[26]; char **entries; }
. Dannwalk = walk->letters[*searchStr++]
bis Sie auf NULL ist, dann gehen Sie durch die Einträge. Laden Sie es von der sqlite-beim Start (in einem hintergrund-thread 😉Nur so gibt es eine nützliche Antwort hier, hier ist meine Antwort auf eine ähnliche Frage stellen.
Ohne zu wissen, mehr über Ihre app, ich glaube die bessere Lösung wäre, zu halten das Feld auf der main-thread und den Versand wieder auf, Wann immer einem anderen thread etwas ändern müssen. Wie diese:
Natürlich, Sie können sehr viel komplexer mit der Versand-API, aber es nicht umgehen sperren und alles für Sie. Definitiv eleganter als die Verwendung einer NSLock. Es funktioniert nur auf iOS 4 oder später doch.
Können Sie nicht Aktualisieren Sie UI in Hintergrund-threads.
Verwenden Grand Central Displatch
Ich Hier erklärt
https://stackoverflow.com/a/15469885/1239426