gpt4 book ai didi

ios - RxSwift 网络状态可观察

转载 作者:可可西里 更新时间:2023-11-01 01:19:38 26 4
gpt4 key购买 nike

我的 View 模型中有一个方法“getProducts”:

struct MyViewModel {
func getProducts(categoryId: Int) -> Observable<[Product]> {
return api.products(categoryId: categoryId)
}
var isRunning: Observable <Bool> = {
...
}
}

api.products 是一个私有(private)变量,它在后台使用 URLSession rx 扩展名:session.rx.data(...) .

我想在我的 View 模型中有一些 isRunning 观察者,我可以订阅它以了解它是否正在执行网络请求。

这是否可以在不对我的 api 类进行任何修改的情况下完成?

我是响应式编程的新手,因此我们将不胜感激。

谢谢。

最佳答案

这是一个使用帮助类的解决方案,由 RxSwift 作者在 RxSwift Examples 中编写称为 ActivityIndi​​cator

思路很简单

struct MyViewModel {
/// 1. Create an instance of ActivityIndicator in your viewModel. You can make it private
private let activityIndicator = ActivityIndicator()

/// 2. Make public access to observable part of ActivityIndicator as you already mentioned in your question
var isRunning: Observable<Bool> {
return activityIndicator.asObservable()
}

func getProducts(categoryId: Int) -> Observable<[Product]> {
return api.products(categoryId: categoryId)
.trackActivity(activityIndicator) /// 3. Call trackActivity method in your observable network call
}
}

在相关的 ViewController 中,您现在可以订阅 isRunning 属性。例如:

    viewModel.isLoading.subscribe(onNext: { loading in
print(loading)
}).disposed(by: bag)

关于ios - RxSwift 网络状态可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44497773/

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