#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. На самом деле я сейчас использую контроллер потока и во всем разобрался. Так что спасибо вам!