新しい行がすばやく挿入されることがある UITableView があります。新しい行の挿入は、基になるデータが変更されるたびに発生する更新通知をリッスンする通知オブザーバーによって処理されます。すべてのデータ モデルの変更と実際の通知投稿自体に @synchronized ブロックを使用しています...各増分データ変更 (および行挿入) が個別に処理されることを期待しています。ただし、これでも失敗する場合があります。例外は、(データ モデルからのカウントに基づいて) 10 行を期待していることを教えてくれます。以前は 8 行でしたが、更新通知は 1 行を挿入するように指示しただけです (これは、2 つの迅速に開始された通知の最初のものであるため)。 )。
私は、他の人々がこの種の状況にどのように対処する傾向があるかを理解しようとしています. 他の開発者は、2 つのテーブル ビュー更新操作の間でマルチスレッドの競合状態が発生するという問題をどのように軽減していますか? 更新通知を制御するより安全なロックが必要ですか?
どんなアドバイスでも大歓迎です!ありがとう。
いくつかの擬似コード:
私のモデル クラスには、テーブル ビューに新しい行を追加するために他のスレッドによって呼び出される次のようなメソッドがあります。
- (void)addRow:(NSString *)data
{
@synchronized(self.arrayOfData)
{
NSInteger nextIndex = self.arrayData.count;
[self.arrayData addObject:data];
[NSNotificationCenter.defaultCenter postNotificationName:kDataUpdatedNotification object:self userInfo:@{@"insert": @[[NSIndexPath indexPathForRow:nextIndex inSection:0]]}];
}
}
私のコントローラ クラスには、kDataUpdatedNotification 通知を受け取り、実際に行の挿入を実行する次のようなメソッドがあります。
- (void)onDataUpdatedNotification:(NSNotification *)notification
{
NSDictionary *changes = notification.userInfo;
[self.tableView insertRowsAtIndexPaths:changes[@"insert"] withRowAnimation:UITableViewRowAnimationBottom];
}