我有一个 UITableView 有时会快速插入新行。新行的插入由通知观察者处理,该通知观察者监听底层数据更改时触发的更新通知。我在所有数据模型更改和实际通知帖子本身周围使用@synchronized 块......希望每个增量数据更改(和行插入)都将单独处理。但是,有时这仍然失败。异常会告诉我它需要 10 行(基于数据模型的计数),它以前有 8 行,但更新通知只告诉它插入一行(因为这是两个快速触发的通知中的第一个)。
我试图了解其他人倾向于如何处理这些类型的情况。其他开发人员如何缓解两个表视图更新操作之间存在多线程竞争条件的问题?我是否应该有一个更安全的锁来控制更新通知(为什么@synchronized 不做它应该做的事情)?
任何意见是极大的赞赏!谢谢。
一些伪代码:
我的模型类有一个这样的方法,它被其他线程调用以将新行附加到表视图:
- (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];
}