如何在MVVM中使用多个模型

  • 本文关键字:模型 MVVM mvvm rx-swift
  • 更新时间 :
  • 英文 :


到目前为止,我一直在绑定来自现有视图模型的post数据。我需要使用域用户数据在表视图单元格上做额外的UI工作。然后,通过为用户数据创建一个ViewModel,我需要有两个ViewModel吗?或者我必须处理两个模型(Post, UserData)在我现有的ViewModel?

ViewController

class PostsViewController: UIViewController {
let disposeBag = DisposeBag()
var viewModel: PostsViewModel!
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
connect()
}
func connect() {
assert(viewModel != nil)

let cellUpdate = PublishSubject<(PostItemViewModel.ID, Int)>()

let viewWillAppear = rx.viewWillAppear
.mapToVoid()
.catchErrorJustComplete()
let pull = timeLineTableView.refreshControl!.rx
.controlEvent(.valueChanged)
.asObservable()
let reachedBottom = timeLineTableView.rx.reachedBottom().asObservable()

let input = PostsViewModel.Input(fetchInitial: Observable.merge(viewWillAppear, pull), fetchNext: reachedBottom, updateTrigger: cellUpdate)
let output = viewModel.transform(input: input)

let dataSource =
RxTableViewSectionedAnimatedDataSource<PostItemViewModelSection>(
configureCell: { dataSource, tableView, indexPath, id in
let cell =
tableView.dequeueReusableCell(withIdentifier: PostTableViewCell.identifier, for: indexPath) as! PostTableViewCell
cell.connect(postItem: output.posts.compactMap {
$0.first(where: { $0.id == id }) })
.bind(to: cellUpdate)
.disposed(by: cell.disposeBag)
return cell
},
canEditRowAtIndexPath: { _, _ in true }
)

timeLineTableView.dataSource = nil
timeLineTableView.delegate = nil

viewModel.PostItemViewModelSections(postItem: output.posts)
.drive(timeLineTableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)


output.fetching
.drive(timeLineTableView.refreshControl!.rx.isRefreshing)
.disposed(by: disposeBag)
}
}

选择1

class PostsViewController: UIViewController {
let disposeBag = DisposeBag()
var viewModel1: PostsViewModel!
**var viewModel2: UserDataViewModel!**
.....

选择2

class PostsViewController: UIViewController {
let disposeBag = DisposeBag()
var viewModel: PostsAndUserDataViewModel!
.....
let dataSource =
RxTableViewSectionedAnimatedDataSource<PostItemViewModelSection>(
configureCell: { dataSource, tableView, indexPath, id in
let cell =
tableView.dequeueReusableCell(withIdentifier: PostTableViewCell.identifier, for: indexPath) as! PostTableViewCell
cell.connect(postItem: output.posts.compactMap {
$0.first(where: { $0.id == id }) }, **userData: output.userData**)
.bind(to: cellUpdate)
.disposed(by: cell.disposeBag)
return cell
},
canEditRowAtIndexPath: { _, _ in true }
)

ViewModel的工作是为视图提供状态。因此,它与它为之提供状态的视图紧密相连。你似乎把你的ViewModels和Models绑在了一起。

一个ViewModel,顾名思义,建模一个视图,一个TableViewCell是一个视图。给细胞它自己的ViewModel类和每个细胞有自己的ViewModel实例是没有错的。但是基于模型类型拥有不同的ViewModels对我来说是错误的。这是一个服务应该做的事情,而不是一个ViewModel。

最新更新