簡體   English   中英

在VIPER中實現UITableView委托和數據源

[英]Implementation of UITableView delegate and datasource in VIPER

我是第一次在VIPER架構中編寫應用程序,並且無法理解UITableView委托和數據源方法是否應該進入View,Presenter或Interactor? 我在一些鏈接中發現它應該是View類的一部分,但這似乎不對。 即使它是View的一部分,數據將如何到達那里,因為View在技術上不應該要求演示者提供數據。 演示者應該自己推送數據。

您閱讀的鏈接是正確的,具有VIPER體系結構的應用程序中UITableView的委托和數據源方法應保留在View 關於數據如何到達視圖的結論,這是錯誤的,因為View本身應該要求Presenter帶來數據,然后Presenter要求Interactor從Web或數據庫加載數據。 如果您對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/

是的,數據源和委托是視圖層的一部分。

如果您不希望您的視圖向演示者詢問數據,那么您可以像我描述的那樣進行。 數據源類包含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向主持人詢問數據並沒有錯。

允許在View中保留數據源(如果我們不考慮任何其他層,則可能是正確的位置)。 但是,從SOLID的角度來看,它並非100%正確。 VIPER是為了推動單一責任原則 View保留表數據源/委托可能會導致違反此原則,因為非視圖相關的代碼,可能在委托/數據源中。 View限制為負責與View相關的任務要好得多。 理想情況下,它不應該作為數據提供者,即使作為tableview的數據源也是如此。 也就是說,最佳做法是將表視圖DataSource / Delegate Presenter和View 分開實現。 View中聲明數據源(委托)並將其分配給您的表:

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 ,但不是單獨使用,而是通過ViewPresenter的輸出接口獲取數據。 后者有時可以討論,並取決於您的應用程序的復雜性。 可以使用通信協議橋接Presenter和tableview DataSource,並且可以很好地實現,但這取決於團隊采用的方法。 VIPER是關於推動大項目的,其實踐必須方便整個團隊參與。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM