繁体   English   中英

RxSwift。 什么用于Observable <Void> ?

[英]RxSwift. What to use for Observable<Void>?

MVVM上编写项目并尝试使用RxSwift绑定所有内容 不幸的是,我没有找到一种如何绑定动作的正确方法。

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

为此,我将有两个视图模型: 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)
    }
}

您需要某个主题,因为在创建事件的使用者时事件的发射器不存在。 通常我在视图控制器中放置一个主题而不是每个单元格中的主题。 像这样的东西:

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)
    }
}

视图控制器看起来像:

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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM