我是ios和rxswift的新手。尝试为新应用创建mvvm架构。
如果在调用appStartNetwork.fetchApp()之前设置了可观察的isSuccess值,则可以观察该值。但是当我接下来在fetchApp()中设置isSuccess值时,无法触发viewcontroller中的Observer
怎么了?
ViewModel
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()
}
答案 0 :(得分:1)
这里有两个问题,都由相同的编程错误(对处理袋生命周期的错误管理)引起。
通过在getAppStart
范围内创建处理包,可以将其生命周期与函数的生存时间绑定在一起。意味着当功能完成时,处理袋将处理其附加的订阅。
将disposeBag
和splashVm
的创建移动到视图控制器的作用域(功能之外),应该可以解决您的问题。
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()
}