VIPER中的UITableView数据源的ViewModel,swift

时间:2017-09-11 15:57:12

标签: ios swift uitableview datasource viper

我在最近的项目中使用VIPER架构。 但我想知道如何实现UITableView DataSource。

在VIPER中,View是被动的。他们将事件发送给Presenter,然后Presenter将正确的ViewData(ViewModel)发送到View。

所以我在View中为tableView存储了ViewModels。 (查看不会向Presenter询​​问数据。)

class View: UIViewController, UITableViewDataSource {
  var viewModels: [CellViewModelType] = []

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return viewModels.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let viewModel = viewModels[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIndetifier", for: indexPath)
    cell.configure(with: viewModel)
    return cell
  }
}

当用户在tableView中选择项目时,View将带有indexPath的didSelectItemAt事件发送给Presenter。然后,Presenter决定事件的正确操作,推送VC或获取数据。

所以Presenter应该知道ViewData(或Real Data)。 或者Presenter将事件传递给Interactor,因为Interactor存储了Real Data。

这是我同步的困境。 数据传播View,Presenter,Interactor。它们可能不同,因为Real Data可以在后台异步更改(如聊天应用程序)

非常感谢任何帮助。 :d

2 个答案:

答案 0 :(得分:0)

我是否正确您害怕ViewModels数组和Presenter或Interactor中的数据数据中的数据不一致? 如果是这样,当Interactor提取新数据时,它将传递给Presenter。我更喜欢先将它同步发送到View作为ViewModels,然后将其设置为Presenter的Data数组。 当您调用didSelectCellAtIndexPath:并将带有IndexPath的事件发送给Presenter时,从Data数据访问数据的其他检查是个好主意。

答案 1 :(得分:0)

Presenter应存储ViewModels,Interactor应存​​储实体。因此View应该向演示者询问ViewModel,如此

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let viewModel = presenter.getViewModel(at: indexPath.row)
   let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIndetifier", for: indexPath)
   cell.configure(with: viewModel)
   return cell
}

当用户选择一个项目时,或者可以在交互者上调用一个方法。因此,模块状态仅存储在交互器中,视图状态存储在Presenter中。视图不应该有任何状态