5

我正在学习Viperw/ RxSwift

我想通知我在我Presenter的.viewDidLoadViewController

为此,我有以下内容:

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

加载视图后,我正在调用presenter?.viewDidLoad.onNext(())

然后我可以在我的演示者中触发任何操作,例如调用 myrouter以确保配置导航或我的interactor.

我应该PublishSubject为此使用 a 吗?还是RxSwift有更适合的类型?

我觉得这种方法意味着我最终会得到类似的东西

        viewDidLoad
            .subscribe(onNext: { _ in
                self.router?.viewDidLoad.onNext(())
            }).disposed(by: disposeBag)
4

1 回答 1

2

嗯... Presenter 的工作是收集用户操作,我不太确定我们应该将 viewDidLoad 视为用户操作。在任何情况下,Wireframe(处理路由)不应该首先知道何时调用 viewDidLoad;它的工作是呈现新屏幕,而您不能在 viewDidLoad 中呈现屏幕。

也就是说,您可以在 ViewController 的演示者 didSet 中设置连接:

final class ViewController: UIViewController {

    var presenter: Presenter? {
        didSet {
            guard let presenter = presenter else { viewDidLoadDisposable.dispose(); return }
            viewDidLoadDisposable.disposable = rx.methodInvoked(#selector(viewDidLoad))
                .map { _ in }
                .bind(to: presenter.viewDidLoad)
        }
    }

    let viewDidLoadDisposable = SerialDisposable()

    deinit {
        viewDidLoadDisposable.dispose()
    }
}

final class Presenter {
    let viewDidLoad = PublishSubject<Void>()
}

不过一般来说,它是在 viewDidLoad 中,presenter 和 viewController 元素通常绑定在一起,所以上面的代码感觉很不自然。

此外,Observables、Subjects 和 DisposeBag 不应该s var,而是使用lets。这就是函数式反应式编程的“函数式”部分。

于 2019-09-12T01:16:58.197 回答