我是第一次在VIPER架构中编写应用程序,并且无法理解UITableView
委托和数据源方法是否应该进入View,Presenter或Interactor?我在一些链接中发现它应该是View类的一部分,但这似乎并不正确。即使它是View的一部分,数据将如何到达那里,因为View在技术上不应该要求演示者提供数据。演示者应该自己推送数据。
答案 0 :(得分:2)
您阅读的链接是正确的,具有 VIPER 架构的应用中UITableView
的委托和数据源方法应保留在View
中。
关于数据如何到达视图的结论,这是错误的,因为View
本身应该要求Presenter
带来数据,然后Presenter要求Interactor
加载来自网络或数据库的数据。
如果您对 VIPER 架构有任何疑问,我肯定会推荐这些文章:
第1条:https://blog.mindorks.com/building-ios-app-with-viper-architecture-8109acc72227
第2条:https://cheesecakelabs.com/blog/best-practices-viper-architecture/
第3条:https://cheesecakelabs.com/blog/ios-project-architecture-using-viper/
答案 1 :(得分:2)
是的,数据源和委托是视图层的一部分。
如果您不希望您的视图向演示者询问数据,那么您可以像我描述的那样进行操作。 数据源类包含viewModels(虚拟对象)。然后,您可以通过界面进行通信。我的意思是你可能会更好地理解一些例子:
protocol SomeViewProtocol {
func set(withVMS vms: [SomeViewModel])
}
final class SomeVC: SomeViewProtocol {
let dataSource: SomeDataSource
let tableView: UITableView
override func viewDidLoad() {
tableView.dataSource = dataSource
}
func set(withVMS vms: [SomeViewModel]) {
someDataSource.set(withVMS: vms)
tableView.reloadData()
}
}
protocol SomePresenterProtocol {
...
}
final class SomePresenter: SomePresenterProtocol {
fileprivate let view: SomeViewProtocol
//After view did load
func initAfterLoad() {
.
.
.
view.set(withVMS: viewModels)
}
}
但是从我的角度来看,View向主持人询问数据并没有错。
答案 2 :(得分:1)
允许在View中保留数据源(如果我们不考虑任何其他层,则可能是正确的位置)。但是,从SOLID的角度来看,它并非100%正确。 VIPER是为了推动单一责任原则。将表数据源/委托放在View
中可能会导致违反此原则,因为非视图相关的代码,可能在委托/数据源中。最好将查看限制为仅负责查看相关的任务。理想情况下,它不应该作为数据提供者,即使作为tableview的数据源也是如此。也就是说,最佳做法是从Presenter和View中实现表视图DataSource / Delegate 单独。
在查看中声明数据源(委托)并将其分配给您的表:
let dataSource: DataSource! // Implements both TableView DataSource and Delegate protocols
let tableView: UITableView!
override func viewDidLoad() {
tableView.dataSource = dataSource
tableView.delegate = dataSource
}
然后,数据源将通过输出协议与视图或演示者(如果需要)进行通信,这在VIPER中很常见。
DataSource获取数据的方式来自 Presenter ,但不是单独使用,而是通过查看,从 Presenter 的输出界面。后者有时可以讨论,并取决于您的应用程序的复杂性。可以将 Presenter 和tableview DataSource与通信协议联系起来,并且可以很好地实现,但这取决于团队采用的方法。 VIPER是关于推动大项目的,其实践必须方便整个团队参与。