I am learning Viper
w/ RxSwift
.
I would like to notify my Presenter
that viewDidLoad
was called in my ViewController
.
To do this I have the following:
class LoginPresenter {
weak var view: LoginView?
var interactor: LoginUseCase?
var router: LoginRouter?
private(set) var viewDidLoad = PublishSubject<Void>()
private lazy var disposeBag = DisposeBag()
required init(view: LoginView?, interactor: LoginUseCase?, router: LoginRouter?) {
self.view = view
self.interactor = interactor
self.router = router
viewDidLoad
.subscribe(onNext: { _ in
// do something on viewDidLoad
}).disposed(by: disposeBag)
}
}
class LoginViewController: UIViewController {
var presenter: LoginPresenter?
override func viewDidLoad() {
super.viewDidLoad()
presenter?.viewDidLoad.onNext(())
}
}
Once my view is loaded I am calling presenter?.viewDidLoad.onNext(())
I am then able to trigger any actions within my presenter, such as calling out to my router
to ensure navigation is configured or my interactor
.
Should I be using a PublishSubject
for this? Or does RxSwift
have a better suited type?
I feel like this approach means I will end up with something like
viewDidLoad
.subscribe(onNext: { _ in
self.router?.viewDidLoad.onNext(())
}).disposed(by: disposeBag)