【发布时间】: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并让协调器观察它,但我认为选项一更好。