Jaki jest najlepszy sposób zapewnienia przeładowania UITableView w sposób atomowy?
I'v dostał UITableView, którego źródło danych zostało zaktualizowane w losowych odstępach czasu w bardzo krótkim czasie. W miarę odkrywania kolejnych obiektów są one dodawane do źródła danych tableView i wstawiam konkretny indexPath:
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
Źródło danych znajduje się w klasie menedżera, a powiadomienie jest publikowane po jego zmianie.
- (void)addObjectToDataSource:(NSObject*)object {
[self.dataSource addObject:object];
[[NSNotificationCenter defaultCenter] postNotification:@"dataSourceUpdate" object:nil];
}
ViewController aktualizuje tableView, gdy otrzyma to powiadomienie.
- (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];
}
Działa to dobrze, ale zauważyłem, że w niektórych przypadkach drugi obiekt jest wykrywany, tak jak pierwszy wywołuje endUpdates, a ja otrzymuję wyjątek twierdzący, że mam dwa obiekty w moim źródle danych, gdy tableView oczekiwał jednego.
Zastanawiałem się, czy ktoś nie znalazł lepszego sposobuatomowo wstaw wiersze do widoku tabeli. Myślałem o wprowadzeniu@synchronized (self.tableView) zablokuj aktualizację, ale chciałbym tego uniknąć, jeśli to możliwe, ponieważ jest to kosztowne.