swift - RxSwift。 Observable<Void> 使用什么?

标签 swift mvvm observable rx-swift

MVVM 上编写项目并尝试将所有内容与 RxSwift 绑定(bind)。 不幸的是,我没能找到一种正确的方法来绑定(bind) Action 。

例如,我有一个表格和一个带有一个按钮的简单单元格 - “选择”。

为此,我将有两个 View 模型:ListViewModelCellViewModel

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/

相关文章:

ios - 如何通过 Swift 使用 Base64Url 编码 json 对象,如 JWT header 和有效负载

c# - 将按钮绑定(bind)到命令 (Windows Phone 7.5)

c# - UWP MVVM Observablecollection 已更新但未反射(reflect)在 UI 上

angular - 类型 '{Property : string, Property2: string} 不可分配给类型 Observable<Filters[]>

javascript - 在 RxJS 中有条件地选择 observable

Swift 执行一个简单的测试并将结果传递给函数的参数

ios - 在 RxSwift 中从 searchBar 绑定(bind)到 TableView

swift - 核心图形中的动画

wpf - invokecommandaction使用可以执行吗?

angular - 如果术语不为空/空,如何只执行一个 Observable?