在VIPER

时间:2017-10-23 10:43:25

标签: ios swift uitableview viper-architecture viper

我是第一次在VIPER架构中编写应用程序,并且无法理解UITableView委托和数据源方法是否应该进入View,Presenter或Interactor?我在一些链接中发现它应该是View类的一部分,但这似乎并不正确。即使它是View的一部分,数据将如何到达那里,因为View在技术上不应该要求演示者提供数据。演示者应该自己推送数据。

3 个答案:

答案 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是关于推动大项目的,其实践必须方便整个团队参与。