【问题标题】:trigger an api again once network goes off in RxSwift一旦网络在 RxSwift 中断开,再次触发 api
【发布时间】:2021-08-04 10:10:49
【问题描述】:

下面是我的代码。我需要多次调用 api 直到有网络信号。

 buttonAction.do(onNext: { [weak self] in
                        
                          self?.activity.startAnimating()
                        
                              apiManager.callApi()
                            
                                .do(onNext: { [weak self] in
                                    
                                    self?.activity.stopAnimating()
                                    
                                },onError: { [weak self ] error in
                                    
                                    if let error = error as? NoNetwork {
                                        self?.activity.stopAnimating(errorInfo:error,presentationStyle:.alert)

                                        // here alert will be appear. On click ok button, need to trigger the API() again
                                    }
                                })
                .subscribe().disposed(by:bag)

【问题讨论】:

    标签: rx-swift uiactivityindicatorview reachability


    【解决方案1】:

    请注意,您没有说明要如何处理任何其他类型的错误,因此下面的代码将忽略它们...如果您想显示所有错误的警报,请删除 filter

    let error = PublishSubject<Error>()
    
    let retry = error
        .filter { $0 is NoNetwork }
        .map { $0.localizedDescription }
        .flatMapFirst(presentScene(animated: true, scene: { message in
            UIAlertController(title: "Error", message: message, preferredStyle: .alert)
                .scene { $0.connectOK() }
        }))
        .share()
    
    Observable.merge(buttonAction, retry)
        .subscribe(onNext: { [activity] in
            activity.startAnimating()
        })
        .disposed(by: bag)
    
    Observable.merge(buttonAction, retry)
        .flatMapFirst {
            apiManager.callApi()
                .catch { error.onNext($0); return .just(()) }
        }
        .subscribe(onNext: { [activity] in
            activity.stopAnimating()
        })
        .disposed(by: bag)
    

    presentScene 函数来自我的CLE library。在此代码中,activity 是标准的 UIActivityIndicatorView,而不是您使用的任何代码。

    【讨论】:

    • Observable.merge(buttonAction, retry) 重复两次。我们可以一口气完成吗?
    • 您可以先使用let trigger = Observable.merge(buttonAction, retry),然后在这两个地方使用trigger,但这种“DRY in the small”是一种不必要的间接级别,只会混淆 IMO 代码。跨度>
    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多