gpt4 book ai didi

ios - RxSwift 在另一个 observable next 中设置 observable 值,不起作用

转载 作者:行者123 更新时间:2023-11-28 23:26:03 25 4
gpt4 key购买 nike

我是 ios 和 rxswift 的新手。尝试为新应用创建 mvvm 架构。

如果我在调用 appStartNetwork.fetchApp() 之前设置可观察的 isSuccess 值,我可以观察到该值。但是当我接下来在 fetchApp() 中设置 isSuccess 值时,无法触发 viewcontroller 中的 Observer

怎么了?

View 模型

class SplashViewModel {
var isSuccess = PublishSubject<Bool>()
var isLoading = PublishSubject<Bool>()

private let bag = DisposeBag()
func fetchAppStart() {
self.isLoading.onNext(true)

let appStartNetwork=NetworkProvider.shared.makeAppStartNetwork()
appStartNetwork.fetchApp().subscribe(onNext: { [weak self] apiResult in
switch apiResult{
case let .success(response):
//some codes
self?.isLoading.onNext(false)
self?.isSuccess.onNext(true)
break
case let .failure(errorContent):
break
}
},onError:{ err in
self.isLoading.onNext(false)
self.isSuccess.onNext(false)
}).disposed(by: bag)
} }

View Controller

func getAppStart(){
let splashVm=SplashViewModel()
let disposeBag = DisposeBag()
splashVm.isSuccess.subscribe(onNext: { (ok) in
if(ok){
print("splash success")
self.navigateMain()
}else{
self.showAlert("splash fail")
}

},onError:{ err in
self.showAlert(err.localizedDescription)
}).disposed(by: disposeBag)
splashVm.fetchAppStart()
}

最佳答案

这里有两个问题,都是由相同的编程错误造成的,即对处理包生命周期的错误管理。

通过在 getAppStart 范围内创建处置包,您可以将其生命周期限制到函数的生命周期。这意味着当函数完成时,处置包将处置其附加的订阅。

disposeBagsplashVm 的创建移至 View Controller 的范围(在函数之外),应该可以解决您的问题。

let splashVm=SplashViewModel()
let disposeBag = DisposeBag()

func getAppStart(){
splashVm.isSuccess.subscribe(onNext: { (ok) in
if(ok){
print("splash success")
self.navigateMain()
}else{
self.showAlert("splash fail")
}

},onError:{ err in
self.showAlert(err.localizedDescription)
}).disposed(by: disposeBag)
splashVm.fetchAppStart()
}

关于ios - RxSwift 在另一个 observable next 中设置 observable 值,不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58673477/

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