Was ist der beste Weg, um sicherzustellen, dass UITableView atomar neu geladen wird?

Ich habe eine UITableView, deren dataSource in sehr kurzer Zeit in zufälligen Abständen aktualisiert wird. Wenn mehr Objekte entdeckt werden, werden sie der Datenquelle von tableView hinzugefügt und ich füge den spezifischen indexPath ein:

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

Die Datenquelle befindet sich in einer Manager-Klasse, und bei Änderungen wird eine Benachrichtigung gesendet.

- (void)addObjectToDataSource:(NSObject*)object {
    [self.dataSource addObject:object];
    [[NSNotificationCenter defaultCenter] postNotification:@"dataSourceUpdate" object:nil];
}

Der viewController aktualisiert die tableView, wenn er diese Benachrichtigung erhält.

- (void)handleDataSourceUpdate:(NSNotification*)notification {
    NSObject *object = notification.userInfo[@"object"];
    NSIndexPath *indexPath = [self indexPathForObject:object];

    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}

Das funktioniert einwandfrei, aber ich habe festgestellt, dass in einigen Fällen ein zweites Objekt entdeckt wird, während das erste endUpdates aufruft, und es wird eine Ausnahme gemeldet, die besagt, dass ich zwei Objekte in meiner Datenquelle habe, als die tableView eines erwartete.

Ich habe mich gefragt, ob jemand einen besseren Weg gefunden hatatomar Einfügen von Zeilen in eine tableView. Ich habe darüber nachgedacht, eine@synchronized (self.tableView) Blockiere das Update, aber ich würde es gerne vermeiden, wenn es möglich ist, weil es teuer ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage