RxSwift。 Observable <void>使用什么?

时间:2019-04-30 11:46:13

标签: swift mvvm observable rx-swift

MVVM 上编写项目,并尝试将所有内容与 RxSwift 绑定。 不幸的是,我没有找到适当的方法来绑定动作。

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

为此,我将有两个视图模型:'yes'ListViewModel

CellViewModel将创建ListViewModel的数组,需要订阅选择事件(自定义事件)。

现在,我正在为此目的使用BehaviorSubject,但是它看起来很丑。谁能指出我需要如何使用 RxSwift

CellViewModel

1 个答案:

答案 0 :(得分:0)

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

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