在 MVVM 上编写项目并尝试将所有内容与 RxSwift 绑定(bind)。 不幸的是,我没能找到一种正确的方法来绑定(bind) Action 。
例如,我有一个表格和一个带有一个按钮的简单单元格 - “选择”。
为此,我将有两个 View 模型:ListViewModel
和 CellViewModel
ListViewModel
将创建一个 CellViewModel
数组,并且需要订阅选择事件(自定义事件)。
现在我为此目的使用 BehaviorSubject,但它看起来很丑。谁能告诉我如何使用 RxSwift 来实现它?
class CellViewModel {
private let selectionSubject = BehaviorSubject<Void>(value: ())
// Will be used by ListViewModel
var selectionObservable: Observable<Void> {
return selectionSubject.asObservable()
}
func subscribeOnSelection(_ observable: Observable<Void>, disposeBag: DisposeBag) {
observable
.bind(to: selectionSubject)
.disposed(by: disposeBag)
}
private func autoSelect() {
selectionSubject.on(next: ())
}
}
class Cell: UITableViewCell {
@IBOutlet private var selectionButton: UIButton!
private let disposeBag = DisposeBag()
func bind(to viewModel: CellViewModel) {
viewModel.subscribeOnSelection(selectionButton.rx.tap.asObservable(), disposeBag: disposeBag)
}
}
最佳答案
你在某处需要一个主题,因为当事件的消费者被创建时,事件的发射者并不存在。通常我在 View Controller 中放置一个主题,而不是在每个单元格中放置一个主题。像这样:
class Cell: UITableViewCell {
@IBOutlet private var selectionButton: UIButton!
private var disposeBag = DisposeBag()
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
func configure(with makeViewModel: (Observable<Void>, DisposeBag) -> Void) {
makeViewModel(selectionButton.rx.tap.asObservable(), disposeBag)
}
}
View Controller 看起来像这样:
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let disposeBag = DisposeBag()
var makeViewModel: (Observable<CellID>) -> Observable<[CellID]> = { _ in fatalError() }
override func viewDidLoad() {
super.viewDidLoad()
let cellSelection = PublishSubject<CellID>()
let cells = makeViewModel(cellSelection)
cells
.bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: Cell.self)) { index, element, cell in
cell.configure(with: { selected, disposeBag in
selected
.map { element }
.bind(to: cellSelection)
.disposed(by: disposeBag)
})
return
}
.disposed(by: disposeBag)
}
}
关于swift - RxSwift。 Observable<Void> 使用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55920257/