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?

InformationsquelleAutor ifvc | 2010-07-30
Schreibe einen Kommentar