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