Swift 如何使用Rx-MVVM-C处理具有可观测数据的导航

Swift 如何使用Rx-MVVM-C处理具有可观测数据的导航,swift,rx-swift,Swift,Rx Swift,您好,我正在尝试使用RxSwift做一个项目,我一直在尝试以正确的方式连接协调器和ViewModel 目标 使用可观测值,协调器接收和事件(在这种情况下,当点击一行时)然后执行任何操作 场景 给出一个帖子(字符串) 我有以下协调人: class Coordinator { func start() { let selectedPostObservable = PublishSubject<Post>() let viewControlle

您好,我正在尝试使用RxSwift做一个项目,我一直在尝试以正确的方式连接协调器和ViewModel

目标

使用可观测值,协调器接收和事件(在这种情况下,当点击一行时)然后执行任何操作

场景

给出一个帖子(字符串)

我有以下协调人:

class Coordinator {

    func start() {

        let selectedPostObservable = PublishSubject<Post>()

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

        selectedPostObservable.subscribe { post in
            //Do whatever
        }
    }
}
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()
    }
}

非常感谢。

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

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)
    }
}
类视图模型{
结构输入{
让selectedIndexPath:可观察
}
结构输出{
//用户界面输出
}
让selectedPost=PublishSubject()
let bag=DisposeBag()
func变换(输入:输入)->输出{
let posts:[Post]=可观察的。仅([“1”、“2”、“3”])
//连接选定的索引
input.selectedIndexPath
.withLatestFrom(posts){$1[$0.row]}
.绑定(到:selectedPost)
.处置(由:袋)
返回输出()
}
}
班级协调员{
func start(){
让viewController=viewController()
让viewModel=viewModel()
viewController.viewModel=viewModel
viewModel.selectedPost.subscribe{post in
//做任何事
}
.已处理(由:viewModel.bag处理)
}
}

您可以向您的ViewModel传递协调器的一个实例:
让ViewModel=ViewModel(协调器:self)
PublishSubject
并让协调器观察它,但我认为选项一更好。看起来不错,我将尝试并让您知道。谢谢你,丹尼尔!
class ViewController: UIViewController {

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

    func bindViewModel() {
        let input = ViewModel.Input(selectedIndexPath: tableView.rx.itemSelected.asObservable())
        viewModel.transform(input: input)
    }
}
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)
    }
}