gpt4 book ai didi

ios - 如果我通知操作已完成,我应该使用 PublishSubject 吗?

转载 作者:行者123 更新时间:2023-12-03 19:11:45 24 4
gpt4 key购买 nike

我在学习ViperRxSwift .

我想通知我的PresenterviewDidLoad在我的 ViewController 中被调用.

为此,我有以下内容:

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

加载 View 后,我将调用 presenter?.viewDidLoad.onNext(())
然后我可以在我的演示者中触发任何操作,例如调用我的 router确保配置导航或我的 interactor .

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

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

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

最佳答案

嗯... 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 元素通常绑定(bind)在一起,所以上面的代码感觉很不自然。
此外,Observables、Subjects 和 DisposeBag 不应该是 var s,使用 let s 代替。那是函数式响应式(Reactive)编程的“函数式”部分。

关于ios - 如果我通知操作已完成,我应该使用 PublishSubject 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com