BehaviorRelay.accept 如何在 rxswift 中工作

How BehaviorRelay.accept works in rxswift

我正在通过 BehaviorRelay 绘制一个 tableview。

目前,我正在使用下面的代码作为添加数据的方式。

viewModel.user.append(Person(name: "king", phoneNumber: "12341234"))
viewModel.personObservable.accept(viewModel.user)

我想知道这段代码是否改变了用户本身,从而重绘了整个tableView。 如果可以,用什么方法可以只改变我添加的数据?

所提供的代码导致 personObservable(显然实际上是一个 BehaviorRelay)发出包含整个 Person 值数组的 next 事件,而不仅仅是最新添加的 Person。重要的是,它不会发出 viewModel.user 对象(至少在概念上不是),而是一个完全不同的对象,恰好等于 viewModel.user.

默认数据源,即当您使用 DataSource 对象以外的任何对象调用 items 时获得的数据源,将在 table 视图上调用 reloadData。虽然这不会导致重绘“整个 tableView”,但它会导致 table 视图查询所有可见单元格的数据源,即使它们没有改变.

如果您只希望 table 视图加载新单元格,则数据源对象需要足够智能以将新数组与其当前显示的数组进行比较,以便确定哪些值是不同的 add/remove/move 个适当的单元格,而不是仅仅调用 reloadData。正如@Sweeper 在评论中所说,RxDataSources 库包含一组数据源 classes,它们具有内置的逻辑。如果你想重新发明轮子,只需编写一个符合两者的 class RxTableViewDataSourceType 和 UITableViewDataSource 并自己实现差异。