如何使用响应式编程订阅数据数组中的单项更改(插入或删除)?
How to use reactive programming to subscribe to single-item changes (insertions or deletions) in an array of data?
对于上下文,我使用 swift 和 MVVM 架构来管理数据列表,以及显示它的 table 视图。响应式模式(RxSwift 或 Combine)非常适合让我在视图模型的列表数据更改时重新加载整个 table 视图。
ViewModel(使用 RxSwift):
var tableData = BehaviorRelay<[String]>(value: ["First Item", "Second Item"])
ViewController:
var tableView = UITableView()
var disposeBag = DisposeBag()
var viewModel = ViewModel()
init() {
...
viewModel.tableData.subscribe(onNext: { _ in
self.tableView.reloadData()
}).disposed(by: disposeBag)
}
但是如果只从 tableData
中插入或删除了一项怎么办?在这种情况下,我不想调用 tableView.reloadData()
,而是想使用 tableView.insertRows(at: <[IndexPath]>, with: <UITableView.RowAnimation>)
或 tableView.deleteRows(at: <[IndexPath]>, with: <UITableView.RowAnimation>)
。为此,我需要能够订阅已插入或删除的索引路径,而不是订阅整个列表数据。有谁知道最有效的方法是什么?
使用 UITableViewDiffableDataSource。它会自动(反应性地)为您处理这件事。
对于上下文,我使用 swift 和 MVVM 架构来管理数据列表,以及显示它的 table 视图。响应式模式(RxSwift 或 Combine)非常适合让我在视图模型的列表数据更改时重新加载整个 table 视图。
ViewModel(使用 RxSwift):
var tableData = BehaviorRelay<[String]>(value: ["First Item", "Second Item"])
ViewController:
var tableView = UITableView()
var disposeBag = DisposeBag()
var viewModel = ViewModel()
init() {
...
viewModel.tableData.subscribe(onNext: { _ in
self.tableView.reloadData()
}).disposed(by: disposeBag)
}
但是如果只从 tableData
中插入或删除了一项怎么办?在这种情况下,我不想调用 tableView.reloadData()
,而是想使用 tableView.insertRows(at: <[IndexPath]>, with: <UITableView.RowAnimation>)
或 tableView.deleteRows(at: <[IndexPath]>, with: <UITableView.RowAnimation>)
。为此,我需要能够订阅已插入或删除的索引路径,而不是订阅整个列表数据。有谁知道最有效的方法是什么?
使用 UITableViewDiffableDataSource。它会自动(反应性地)为您处理这件事。