Ios RxSwift显示/隐藏活动指示器的实践
假设我们有表示网络请求调用的伪代码,并使用RxSwift显示/隐藏活动指示器:Ios RxSwift显示/隐藏活动指示器的实践,ios,swift,rx-swift,Ios,Swift,Rx Swift,假设我们有表示网络请求调用的伪代码,并使用RxSwift显示/隐藏活动指示器: func performRequest() { isLoading.accept(true) self.network.executeRequest() .subscribe(onNext: { self.isLoading.accept(false) }, onError: { self.isLoading.accept(false
func performRequest() {
isLoading.accept(true)
self.network.executeRequest()
.subscribe(onNext: {
self.isLoading.accept(false)
}, onError: {
self.isLoading.accept(false)
})
}
函数executeRequest
返回一个可观察的
或单个
我对必须为onNext/onSuccess和onError编写两次相同的代码感到不舒服,基本上都是这样做的
我正在寻找最小化/改进关闭活动指示器的建议,例如在单个语句中处理请求的所有事件,避免使用
subscribe
功能。或者可能还有其他建议?您可以使用另一种方法进行订阅,如果是Observer
则传递Event
,如果是Single
,则传递SingleEvent
:
subscribe(on: (Event<T>) -> Void)
subscribe(observer: (SingleEvent<T>) -> Void)
单一示例:
您可以使用另一种方法进行订阅,如果是
观察者
则传递事件
,如果是单一
,则传递单一事件
:
subscribe(on: (Event<T>) -> Void)
subscribe(observer: (SingleEvent<T>) -> Void)
单一示例: 我使用了from RxSwift示例应用程序,这使它非常方便,尤其是当您并行加载多个内容时,因为它保持了正在运行的订阅计数,并且仅当此计数等于0时才会发出
false
:
let isLoading=ActivityIndicator()
func performRequests(){
自我网络
.executeFirstRequest()
.trackActivity(isLoading)
.订阅{
// ...
}
自我网络
.executeSecondRequest()
.trackActivity(isLoading)
.订阅{
// ...
}
}
我使用RxSwift示例应用程序,这使它非常方便,尤其是当您并行加载多个内容时,因为它保持了正在运行的订阅计数,并且仅当此计数等于0时才会发出false
:
let isLoading=ActivityIndicator()
func performRequests(){
自我网络
.executeFirstRequest()
.trackActivity(isLoading)
.订阅{
// ...
}
自我网络
.executeSecondRequest()
.trackActivity(isLoading)
.订阅{
// ...
}
}
我有点困惑:函数executeRequest
返回一个可观察的或单个
。你能再解释一下吗?@Erumaru那只是伪代码,这意味着函数executeRequests
只是一个虚构的函数,但它实际上代表了与网络相关的函数,这些函数要么返回一个可观察的,要么返回一个。好的,我已经更新了我的答案,以涵盖这两种情况。我有点困惑:函数executeRequest
返回一个可观察的或单个
。你能再解释一下吗?@Erumaru那只是伪代码,这意味着函数executeRequests
只是一个虚构的函数,但它实际上代表了与网络相关的函数,这些函数要么返回一个可观察的函数,要么返回一个。好的,我已经更新了我的答案,以涵盖这两种情况。谢谢回答。我想我在这件事上的问题没有那么完整:/。我知道这个subscribe
功能,它可以解决我的问题。问题是我想避免使用subscribe。我宁愿使用do
函数,但它没有类似的功能。@OlegDanu嗯,好的。然后,我没有回答这个问题。@OlegDanu你可以选择看看PromiseKit。没有太多理由添加另一个依赖项。@OlegDanu好的,我在这里留下我的答案,可能会帮助其他人。希望你能找到答案!谢谢你的回答。我想我在这件事上的问题没有那么完整:/。我知道这个subscribe
功能,它可以解决我的问题。问题是我想避免使用subscribe。我宁愿使用do
函数,但它没有类似的功能。@OlegDanu嗯,好的。然后,我没有回答这个问题。@OlegDanu你可以选择看看PromiseKit。没有太多理由添加另一个依赖项。@OlegDanu好的,我在这里留下我的答案,可能会帮助其他人。希望你能找到答案!谢谢@jegnux。看起来这正是我需要的。我本打算回答这个问题,但上面的内容正是我所建议的,所以我投了更高的票。回答得好@jegnux@杰德努斯:我现在有点困惑。看起来,ActivityIndicator
没有随RxSwift库提供。它仅在RxExample文件夹中可用。这是否意味着我需要复制/粘贴代码才能使用它?还是我缺少了一个导入
之类的东西?谢谢@jegnux。看起来这正是我需要的。我本打算回答这个问题,但上面的内容正是我所建议的,所以我投了更高的票。回答得好@jegnux@杰德努斯:我现在有点困惑。看起来,ActivityIndicator
没有随RxSwift库提供。它仅在RxExample文件夹中可用。这是否意味着我需要复制/粘贴代码才能使用它?还是我缺少了一个导入
之类的东西?
func performRequest() {
isLoading.accept(true)
self.network.executeRequest().subscribe {
switch $0 {
case let .error(error):
print(error)
case let .next:
print("good")
}
isLoading.accept(false)
}
}