使用Swift将VIPER架构存储在演示者中的数据

时间:2019-04-16 08:54:54

标签: swift architecture

所以我要在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中。关于变量琐事的评论,如果涉及变量名或类似名称,则很少有帮助。

有什么问题吗?我想知道是否可以在演示者中存储下载的数据项的数量。

0 个答案:

没有答案