RxSwift, MVVM: связь с дочерним контроллером просмотра

#ios #mvvm #rx-swift #clean-architecture

#iOS #mvvm #rx-swift #чистая архитектура

Вопрос:

Я пытаюсь следовать https://github.com/sergdort/CleanArchitectureRxSwift создание приложения с помощью RxSwift и MVVM.

Я не могу понять, как взаимодействовать с дочерним контроллером просмотра в этом сценарии.

У меня есть один триггер из ParentViewController , который необходим в ChildViewModel , и второй из ChildViewModel , который должен вызвать некоторые изменения пользовательского интерфейса в ParentViewController :

 trigger1: ParentViewController (input)> ... (no idea)> ChildViewModel
trigger2: ChildViewModel (output)> ... (no idea)> ParentViewController
  

Мой код в настоящее время выглядит примерно так:

 final class ParentViewController: UIViewController {
    var viewModel: ParentViewModel?
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        bindViewModel()
    }

    private func bindViewModel() {
        guard let viewModel = self.viewModel else {
            fatalError("View Model not set!")
        }

        let triggerToChild = rx.someTrigger

        let input = ParentViewModel.Input(triggerToChild: triggerToChild)

        let output = viewModel.transform(input: input)

        output.triggerFromChild
            .drive(rx.someProperty)
            .disposed(by: disposeBag)
    }
}

final class ParentViewModel: ViewModelType {
    struct Input {
       let triggerToChild: Driver<Void>
    }
    struct Output {
       let triggerFromChild: Driver<Void>
    }

    func transform(input: Input) -> Output {
        let triggerFromChild = ??? <===================

        return Output(triggerFromChild: triggerFromChild)
    }
}

final class ChildViewController: UIViewController {
    var viewModel: ChildViewModel?
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        bindViewModel()
    }

    private func bindViewModel() {
        guard let viewModel = self.viewModel else {
            fatalError("View Model not set!")
        }

        let triggerFromParent = ??? <===================

        let input = ChildViewModel.Input(triggerFromParent: triggerFromParent)

        let output = viewModel.transform(input: input)

        output.triggerFromParent
            .drive(rx.someProperty)
            .disposed(by: disposeBag)
    }
}

final class ChildViewModel: ViewModelType {
    struct Input {
        let triggerFromParent: Driver<Void>
    }
    struct Output {
        let triggerToParent: Driver<Void>
    }

    func transform(input: Input) -> Output {
        let triggerToParent = rx.someTrigger
        return Output(triggerToParent: triggerToParent)
    }
}
  

Может быть, кто-нибудь мог бы указать мне правильное направление? Спасибо!

Комментарии:

1. MVVM сам по себе не переходит в переходы и состояния между экранами. Чтобы объяснить это, нынешний популярный подход заключается в том, Flow Coordinator чтобы обычно быть Flow Controller

2. На самом деле я сейчас использую контроллер потока и во всем разобрался. Так что спасибо вам!