你可以使用路由枚举并在ViewModel中使其变为可观察。
enum MoviesListViewModelRoute {
case initial
case showMovieDetail(title: String, overview: String, posterPlaceholderImage: Data?, posterPath: String?)
}
final class DefaultMoviesListViewModel: MoviesListViewModel {
let route: Observable<MoviesListViewModelRoute> = Observable(.initial)
...
func didSelect(item: MoviesListItemViewModel) {
route.value = .showMovieDetail(title: item.title,
overview: item.overview,
posterPlaceholderImage: item.posterImage.value,
posterPath: item.posterPath)
}
观察来自视图控制器(viewController)的路由值,并在该值更改时呈现它:
final class MoviesListViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
bind(to: viewModel)
viewModel.viewDidLoad()
}
private func bind(to viewModel: MoviesListViewModel) {
viewModel.route.observe(on: self) { [weak self] in
self?.handle($0)
}
}
}
extension MoviesListViewController {
func handle(_ route: MoviesListViewModelRoute) {
switch route {
case .initial: break
case .showMovieDetail(let title, let overview, let posterPlaceholderImage, let posterPath):
let vc = moviesListViewControllersFactory.makeMoviesDetailsViewController(title: title,
overview: overview,
posterPlaceholderImage: posterPlaceholderImage,
posterPath: posterPath)
navigationController?.pushViewController(vc, animated: true)
}
}
}