gpt4 book ai didi

ios - 防止处置 PublishSubject (RxSwift)

转载 作者:行者123 更新时间:2023-11-28 05:58:40 26 4
gpt4 key购买 nike

我正在努力处理包含 RxSwift 的 PublishSubject 的特定用例。

为了简单起见,省略了不重要的细节。

有一个 MVVM 设置。在 VC 中,我有一个 UIButton,点击它应该发送网络调用。在 ViewModel 我有一个 buttonDidTapSubject: PublishSubject<Void> .

class ViewModel {
let disposeBag = DisposeBag()
let buttonDidTapSubject = PublishSubject<Void>()
let service: Service
typealias Credentials = (String, String)
var credentials: Observable<Credentials> {
return Observable.just(("testEmail", "testPassword"))
}
init(_ service: Service) {
self.service = service
buttonDidTapSubject
.withLatestFrom(credentials)
.flatMap(service.login) // login method has signature func login(_ creds: Credentials) -> Observable<User>
.subscribe(onNext: { user in print("Logged in \(user)") },
onError: { error in print("Received error") })
.disposed(by: disposeBag)
}
}

class ViewController: UIViewController {
let viewModel: ViewModel
let button = UIButton()
init(_ viewModel: ViewModel) {
self.viewModel = viewModel
}
}

在 Controller 的 viewDidLoad 中我做了一个绑定(bind):

override func viewDidLoad() {
button.rx.tap.asObservable()
.subscribe(viewModel.buttonDidTapSubject)
.disposed(by: disposeBag)
}

问题是,因为网络请求可能会失败并且从login(_:) 返回的Observable|方法会产生错误,整个订阅buttonDidTapSubject在 ViewModel 中将被处置。按钮上的所有其他点击都不会触发在 ViewModel 中登录的序列。

有什么办法可以避免这种行为?

最佳答案

您可以使用retry 来阻止完成订阅。如果您只想在特定情况或错误时重试,您还可以使用 retryWhen 运算符

在 View 模型中:

lazy var retrySubject: Observable<Void> = {
return viewModel.buttonDidTapSubject
.retryWhen { error in
if (error == .networkError){ //check here your error
return .just(Void())
} else {
return .never() // Do not retry
}
}
}()

在 View Controller 中,我会以另一种方式完成:

override func viewDidLoad() {
super.viewDidLoad()
button.rx.tap.asObservable()
.flatMap { [weak self] _ in
return self?.viewModel.retrySubject
}
.subscribe(onNext: {
//do whatever
})
.disposed(by: disposeBag)
}

关于ios - 防止处置 PublishSubject (RxSwift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50584324/

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