Как мне обрабатывать обратные вызовы при использовании селекторов? - PullRequest
0 голосов
/ 07 ноября 2019

Я помещаю свой логический код в viewModel. view вызывает один метод в viewController. Затем этот метод вызывает остальные методы в viewModel, используя #selectors. Это работает нормально до тех пор, пока tableView не будет перезагружен с tableView.reloadData(). Эта часть, очевидно, должна быть в view.

Обычно это можно сделать с помощью нескольких замыканий. Но так как #selectors не может иметь параметры, у меня не может быть обратного вызова completion() в последнем вызываемом методе. Итак, мой вопрос, как мне обойти эту проблему? Есть ли хорошие альтернативы использованию #selectors? Должен ли я иметь наблюдателя в view, подписавшегося на последний метод viewModel? Является ли RxSwift альтернативой? Или есть обходной путь, используя #selectors?

1 Ответ

0 голосов
/ 07 ноября 2019

RxSwift - хорошая альтернатива, но в случае, если вам нужно что-то не столь тяжелое, вам нужен шаблон делегата:

protocol ViewDelegate {
    // Other functions you might need
    func reloadTableView()
}

Then in your viewController, you implement these:

class ViewController: ViewDelegate {
    func reloadTableView() {
        tableView.reloadData()
    }
}

И где-то в вашей модели представления вам нужно определить делегат:

weak var viewDelegate: ViewDelegate

А также назначьте его при создании классов:

let model = ViewModel()
let view = ViewController()

model.viewDelegate = view

Официальная документация Swift имеет гораздо больше о протоколах: https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

...