非常に短期間にランダムな間隔で dataSource が更新された UITableView を取得しました。より多くのオブジェクトが検出されると、それらは tableView のデータ ソースに追加され、特定の indexPath を挿入します。
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
データ ソースはマネージャー クラスにあり、変更されると通知が送信されます。
- (void)addObjectToDataSource:(NSObject*)object {
[self.dataSource addObject:object];
[[NSNotificationCenter defaultCenter] postNotification:@"dataSourceUpdate" object:nil];
}
viewController は、この通知を受け取ると tableView を更新します。
- (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];
}
これは正常に動作しますが、場合によっては、最初のオブジェクトが endUpdates を呼び出しているときに 2 番目のオブジェクトが検出され、tableView が 1 つを予期していたときに、データ ソースに 2 つのオブジェクトがあると主張する例外が発生することに気付きました。
tableViewに行をアトミックに挿入するより良い方法を誰かが見つけたのではないかと思っていました。更新の前後に@synchronized(self.tableView)ブロックを入れようと思っていたのですが、コストがかかるのでできれば避けたいです。