2013-08-28 10 views
7

Bei Verwendung von - (void)beginUpdates und - (void)endUpdates auf einem UITableView müssen Sie die Änderungen an der Datenquelle innerhalb von Aufrufen vornehmen?UITableView Beginn/Ende Updates

dh

Wenn ich ein NSMutableArray genannt dataSource mein Fahr tableView könnte ich dies tun ...

// edit the actual data first 
[dataSource addObject:@"Blah"]; 

// now update the table 
[self.tableView beginUpdates]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

Oder ist es notwendig zu tun ...

[self.tableView beginUpdates]; 

[dataSource addObject:@"Blah"]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

Nur Ich frage, weil ich ein paar Orte habe, an denen ich mich aktualisiere, und ich könnte möglicherweise den gemeinsamen Code zu einer Funktion herausnehmen.

Aber nur wenn ich außerhalb der Update-Aufrufe updaten kann.

Antwort

10

Es ist im Allgemeinen eine gute Idee, die Datenquelle zwischen tableView beginUpdates/endUpdates zu aktualisieren. Nachdem das endUpdates aufgerufen wurde, löst das Betriebssystem die dataSource-Aufrufe aus, um die Abschnitte und Zeilenanzahl abzurufen. Wenn zu diesem Zeitpunkt die Datenquelle nicht aktualisiert wurde, kann es zu Abstürzen von TableView-Inkonsistenzen kommen.

In einigen Fällen kann es vorkommen, dass die Datenquelle vor dem Aufruf von TableView beginUpdates/endUpdates aktualisiert wird. Sie müssen jedoch sicherstellen, dass Sie die Datenquelle im selben Thread und in derselben Ausführungsschleife aktualisieren. Da tableView-Aktualisierungen im Hauptthread durchgeführt werden müssen, müssen Sie Ihre Aktualisierungen der Datenquelle im Hauptthread vornehmen.

Wenn Sie die Datenquelle aktualisieren und nicht sofort Ihre tableView-Aktualisierungen vornehmen (und etwas wie das Drehen des Bildschirms tun), können Sie einen tableView-Inkonsistenzabsturz erhalten.

+0

Wo sollte ich diese Codezeilen in viewdidload hinzufügen? oder cellforrowatindexpath? oder irgendeine andere Methode? –

+0

Dies ist sehr wichtig "Sie müssen sicherstellen, dass Sie die Datenquelle im selben Thread aktualisieren" – Siyavash

+0

@Siyavash wie kann ich das tun? Ich habe nur wenige Delegierte, die die Datenquelle aktualisieren, um sicherzustellen, dass sie im selben Thread aktualisiert werden. – titan

2

Ich habe immer den ersten Ansatz verwendet und es verursacht kein Problem. Stellen Sie nur sicher, dass Sie nach dem Ändern der Datenquelle sofort Ihre Tabelle aktualisieren.

2

Es gibt keine Regel, die besagt, dass Aktualisierungen der Datenquelle innerhalb der Anfangs-/Endaufrufe sein müssen. Stellen Sie sicher, dass Sie nach dem Aktualisieren der Datenquelle Zeilen nach Bedarf einfügen/löschen, um die Dinge auf lange Sicht nicht zu beeinträchtigen.

3

Ich bin gerade auch auf das gekommen und weiß nicht, wie es am besten ist. Das offizielle Dokument, Table View Programming Guide, enthält jedoch einige Informationen dazu. In „Ein Beispiel für Batched Einfüge- und Löschoperationen“ wird erwähnt:

einzufügen und eine Gruppe von Zeilen und Abschnitte in einer Tabellenansicht zu löschen, bereiten zuerst das Array (oder Arrays), die das sind Datenquelle für die Abschnitte und Zeilen. Nachdem Zeilen und Abschnitte gelöscht und eingefügt wurden, werden die resultierenden Zeilen und Abschnitte aus diesem Datenspeicher gefüllt.

Hoffe das hilft. Und ich bin gespannt darauf, das klarer zu lernen, wenn es jemand besser erklären kann.