4

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

4

3 回答 3

4

您阅读的链接是正确的,具有VIPERUITableView架构的应用程序中的委托和数据源方法应保留在. 关于您关于数据如何到达视图的结论,这是错误的,因为它本身应该要求带来数据,然后 Presenter 要求从 Web 或数据库加载数据。如果您对VIPER架构有任何疑问,我绝对推荐这些文章:ViewViewPresenterInteractor

第1条:https ://blog.mindorks.com/building-ios-app-with-viper-architecture-8109acc72227

第2条:https ://cheesecakelabs.com/blog/best-practices-viper-architecture/

第三条:https ://cheesecakelabs.com/blog/ios-project-architecture-using-viper/

于 2017-10-23T10:53:35.167 回答
3

是的,数据源和委托是视图层的一部分。

如果您不希望您的视图向演示者询问数据,那么您可以像我描述的那样做。数据源类包含 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 向演示者询问数据并没有错。

于 2017-10-23T11:07:20.983 回答
1

允许将数据源留在 View 中(如果我们不考虑任何其他层,这可能是正确的位置)。但是,从 SOLID 的角度来看,它并不是 100% 正确的。VIPER 是为推动单一责任原则而制定的。View由于与视图无关的代码,可能会在委托/数据源中保留表数据源/委托,这很可能会导致违反此原则。最好将View限制为负责与View相关的任务。理想情况下,它不应该作为数据提供者,甚至作为 tableview 的数据源。也就是说,最好的做法是分别实现表视图 DataSource/ Delegate来自演示者和视图。在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,但不是通过它自己,而是通过View,它从Presenter的输出接口获取数据。后者有时是可讨论的,取决于您的应用程序的复杂性。可以通过通信协议桥接Presenter和 tableview DataSource 并且可以很好地实现,但这取决于您的团队采用的方法。VIPER 是关于推动大型项目的,它的实践必须方便整个团队参与。

于 2017-10-23T11:11:41.910 回答