所以我要在Swift中建立一个简单的VIPER架构。
Interactor从API获取一些数据,然后将数据传递给演示者,然后由演示者将格式化的数据传递给视图。
演示者将处理数据,只计算下载的对象数。为此,我在演示者中存储了一个var。问题是我应该在演示者中存储数据吗?
交互者:
class Interactor {
weak var presenter: Presenter?
func getData() {
ClosureDataManager.shared.fetchBreaches(withURLString: baseUrl + breachesExtensionURL, completion: { [weak self] result in
guard let self = self else { return }
switch result {
case .failure(let error):
print(error)
case .success(let breaches):
self.presenter?.dataDidFetch(breaches: breaches)
self.presenter?.dataNumberDidFetch(number: breaches.count)
}
})
}
}
演示者:
class Presenter {
var wireframe: Wireframe?
var view: ViewController?
var interactor: Interactor?
var dataDownloaded = 0
func viewDidLoad() {
print ("presenter vdl")
}
func loadData() {
interactor?.getData()
}
func dataDidFetch(breaches: [BreachModel]) {
view?.dataReady()
}
func showDetail(with text: String, from view: UIViewController) {
wireframe?.pushToDetail(with: text, from: view)
}
func dataNumberDidFetch(number: Int) {
dataDownloaded += number
view?.showData(number: String(dataDownloaded) )
}
}
视图(ViewController)
protocol dataViewProtocol {
func showData(number: String)
}
class ViewController: UIViewController, dataViewProtocol {
@IBOutlet weak var showDetailButton: UIButton!
@IBOutlet weak var dataLabel: UILabel!
// weak here means it won't work
var presenter: Presenter?
@IBAction func buttonPressAction(_ sender: UIButton) {
presenter?.loadData()
}
@IBAction func buttonShowDetailAction(_ sender: UIButton) {
presenter?.showDetail(with: "AAA", from: self)
}
func dataReady() {
showDetailButton.isEnabled = true
}
func showData(number: String) {
dataLabel.text = number
}
override func viewDidLoad() {
super.viewDidLoad()
Wireframe.createViewModule(view: self)
presenter?.viewDidLoad()
}
}
路由器(线框)
class Wireframe {
static func createViewModule (view: ViewController) {
let presenterInst = Presenter()
view.presenter = presenterInst
view.presenter?.wireframe = Wireframe()
view.presenter?.view = view
view.presenter?.interactor = Interactor()
view.presenter?.interactor?.presenter = presenterInst
}
}
那么应该使用主持人来存储下载的对象数吗?
您尝试了什么,我已经实现了var,如上所示。这是问题的最小示例。
您使用了哪些资源:我查看了StackOverflow,然后搜索了该问题。我找不到答案,但是知道我可以在视图中存储数据,但是我认为这是不正确的。我可以在Interactor中存储大量数据,但这似乎也不对。一切似乎...违反了关注点分离...
我不会做家庭作业/使用其他体系结构/您应该使用协议/为什么您的实现中只有一个协议这不是家庭作业,这是出于我自己的目的-研究。可能还有其他体系结构可用于执行此操作(对协议进行编码是一种很好的做法),但这与在演示者中存储变量有关。我想知道是否应该使用VIPER和Swift将变量存储在presenter中。关于变量琐事的评论,如果涉及变量名或类似名称,则很少有帮助。
有什么问题吗?我想知道是否可以在演示者中存储下载的数据项的数量。