我在最近的项目中使用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
答案 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中。视图不应该有任何状态