我正在为我最近的项目使用 VIPER 架构。但我想知道如何实现 UITableView 数据源。
在 VIPER 中,视图是被动的。他们向 Presenter 发送事件,然后 Presenter 向 View 发送正确的 ViewData(ViewModel)。
所以我在 View 中存储了 tableView 的 ViewModels。(View 不会向 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 中选择项目时,ViewdidSelectItemAt
会向 Presenter 发送带有 indexPath 的事件。然后 Presenter 为事件决定适当的操作,推送 VC 或获取数据。
所以 Presenter 应该知道 ViewData(或 Real Data)。或者 Presenter 将事件传递给 Interactor,因为 Interactor 存储的是 Real Data。
这是我的同步困境。数据分布在 View、Presenter、Interactor。它们可能不同,因为 Real Data 可以在后台异步更改(如聊天应用程序)。因为锁定是完全不合适的,我如何确保 VIPER 架构中多个线程之间的状态数据完整性?
任何帮助将不胜感激。:D