【问题标题】:RxSwift. What to use for Observable<Void>?RxSwift。 Observable<Void> 使用什么?
【发布时间】:2019-09-19 01:48:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift mvvm observable rx-swift


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多