【问题标题】:How to handle navigation with observables using Rx-MVVM-C如何使用 Rx-MVVM-C 处理带有可观察对象的导航
【发布时间】:2019-01-09 16:06:15
【问题描述】:

您好,我正在尝试使用 RxSwift 做一个项目,但我被困在试图以正确的方式完成 Coordinator 和 ViewModel 之间的连接。

目标

使用可观察对象,协调器接收和事件(在这种情况下,当一行被点击时)然后做任何事情。 p>

场景

提供帖子(字符串)

typealias Post = String

我有以下协调员

class Coordinator {

    func start() {

        let selectedPostObservable = PublishSubject<Post>()

        let viewController = ViewController()
        let viewModel = ViewModel()
        viewController.viewModel = viewModel

        selectedPostObservable.subscribe { post in
            //Do whatever
        }
    }
}

selectedPostObservable 是我不知道如何以“干净”的方式将它与 viewModel 连接起来的东西。

作为ViewModel

class ViewModel {

    struct Input {
        let selectedIndexPath: Observable<IndexPath>
    }

    struct Output { 
        //UI Outputs
    }

    func transform(input: Input) -> Output {
        let posts: [Post] = Observable.just(["1", "2", "3"])

        //Connect with selectedindex
        let result = input.selectedIndexPath
            .withLatestFrom(posts) { $1[$0.row] }
            .asDriver(onErrorJustReturn: nil)

        return Output()
    }
}

result 变量是我应该与 selectedPostObservable 连接的变量。

ViewController(虽然我认为与问题无关):

class ViewController: UIViewController {

    //...
    var viewModel: ViewModel!
    var tableView: UITableView!
    //...

    func bindViewModel() {
        let input = ViewModel.Input(selectedIndexPath: tableView.rx.itemSelected.asObservable())
        viewModel.transform(input: input)
    }
}

非常感谢。

【问题讨论】:

  • 您可以将协调器的实例传递给您的 ViewModel:let viewModel = ViewModel(coordinator: self)PublishSubject 并让协调器观察它,但我认为选项一更好。

标签: swift rx-swift


【解决方案1】:

使用您开始使用的结构,我会将 PublishSubject 放在 ViewModel 类中,而不是 Coordinator 中。然后是这样的:

class ViewModel {

    struct Input {
        let selectedIndexPath: Observable<IndexPath>
    }

    struct Output { 
        //UI Outputs
    }

    let selectedPost = PublishSubject<Post>()
    let bag = DisposeBag()

    func transform(input: Input) -> Output {
        let posts: [Post] = Observable.just(["1", "2", "3"])

        //Connect with selectedindex
        input.selectedIndexPath
            .withLatestFrom(posts) { $1[$0.row] }
            .bind(to: selectedPost)
            .disposed(by: bag)

        return Output()
    }
}

class Coordinator {

    func start() {

        let viewController = ViewController()
        let viewModel = ViewModel()
        viewController.viewModel = viewModel

        viewModel.selectedPost.subscribe { post in
            //Do whatever
        }
        .disposed(by: viewModel.bag)
    }
}

【讨论】:

  • 看起来不错,我会尝试并告诉你。谢谢丹尼尔!
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2020-08-10
  • 1970-01-01
  • 2017-10-14
相关资源
最近更新 更多