![](/img/trans.png)
[英]Fails to call delegate/datasource methods in UITableView implementation
[英]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 ,但不是單獨使用,而是通過View從Presenter的輸出接口獲取數據。 后者有時可以討論,並取決於您的應用程序的復雜性。 可以使用通信協議橋接Presenter和tableview DataSource,並且可以很好地實現,但這取決於團隊采用的方法。 VIPER是關於推動大項目的,其實踐必須方便整個團隊參與。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.