Архитектура VIPER с использованием Swift для хранения данных в презентере - PullRequest
1 голос
/ 16 апреля 2019

Итак, я настраиваю простую архитектуру VIPER в Swift.

Interactor получает некоторые данные из API и передает их докладчику, который затем передает отформатированные данные в представление.

Докладчик обработает данные и просто посчитает количество загруженных объектов. Для этого я сохранил переменную в докладчике. Вопрос должен ли я хранить данные в докладчике?

Interactor:

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)
            }

        })
    }

}

Presenter:

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. Комментарии о пустяках вокруг вопроса редко бывают полезны, если речь идет об именах переменных и т. П.

В чем вопрос? Я хочу знать, смогу ли я сохранить количество загруженных элементов данных в докладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...