一旦网络在 RxSwift 中断开,再次触发 api

Posted

技术标签:

【中文标题】一旦网络在 RxSwift 中断开,再次触发 api【英文标题】:trigger an api again once network goes off in RxSwift 【发布时间】: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)

【问题讨论】:

【参考方案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 代码。跨度>

以上是关于一旦网络在 RxSwift 中断开,再次触发 api的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 跳过事件直到自己的序列完成

Socket.io断开事件错误地为其他用户触发,然后再次连接

iOS RxSwift - 如何“断开”一个 observable?

未调用 RxSwift 订阅块

使用 RxSwift 在网络请求后更新 SwiftUI 列表

如何专注于打开和模态的触发元素,一旦保存内容,整个页面就会被销毁并再次呈现