RxSwift 练习到 show/hide ActivityIndi​​cator

RxSwift practice to show/hide ActivityIndicator

假设我们有这个伪代码代表网络请求调用和 show/hide 一个 activity 指标,使用 RxSwift:

func performRequest() {
   isLoading.accept(true)
   self.network.executeRequest()
       .subscribe(onNext: {
           self.isLoading.accept(false)
       }, onError: {
           self.isLoading.accept(false)
       })
}

函数 executeRequest returns ObservableSingle

对于必须为 onNext/onSuccess 和 onError 编写两次相同的代码,我感到不舒服,基本上是一样的。

我正在寻找有关 minimize/improve 关闭 activity 指示器的建议,例如在单个语句中处理请求的所有事件并避免使用 subscribe 函数。或者还有其他建议?

您可以使用另一种方法订阅,在 Observer 的情况下通过 Event 或在 Single 的情况下通过 SingleEvent:

subscribe(on: (Event<T>) -> Void)
subscribe(observer: (SingleEvent<T>) -> Void)

观察者示例:

func performRequest() {
    isLoading.accept(true)
    self.network.executeRequest().subscribe {
        switch [=11=] {
        case let .error(error):
            print(error)
        case let .next:
            print("good")
        case .completed:
            print("also good")
        }
        isLoading.accept(false)
    }
}

单个示例:

func performRequest() {
    isLoading.accept(true)
    self.network.executeRequest().subscribe {
        switch [=12=] {
        case let .error(error):
            print(error)
        case let .next:
            print("good")
        }
        isLoading.accept(false)
    }
}

我使用 RxSwift Example 应用程序中的 ActivityIndicator,这非常方便,特别是如果您并行加载多个内容,因为它维护了 运行 个订阅并发出 false仅当此计数等于 0 时:

let isLoading = ActivityIndicator()

func performRequests() {
   self.network
       .executeFirstRequest()
       .trackActivity(isLoading)
       .subscribe { 
           // ...
       }

   self.network
       .executeSecondRequest()
       .trackActivity(isLoading)
       .subscribe { 
           // ...
       }
}