RxSwift, MVVM: связь с контроллером дочернего представления - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь следовать 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)
    }
}

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

...