【问题标题】:RxSwift - How to handle different error scenarios with Observable.zipRxSwift - 如何使用 Observable.zip 处理不同的错误场景
【发布时间】:2020-07-27 13:23:53
【问题描述】:

我有这个代码:

    ...
    let minMaxReq = networkProvider.getMinMaxAmortization(id: id)
    let emitExtractReq = networkProvider.getEmitExtract(id: id)

    self.isLoading.accept(true)

    Observable.zip(minMaxReq.asObservable(), emitExtractReq.asObservable()) { (minMaxResp, emitExtractResp) in
            return (minMaxResp, emitExtractResp)
        }.subscribe(onNext: { [weak self] responses in

            let minMaxResp = responses.0
            let emitExtractResp = responses.1

            guard let self = self else { return }

            self.isLoading.accept(false)
            self.getMinMaxAmortizationResponse.accept(minMaxResp)
            self.receiptsCNH.accept(emitExtractResp)

        }, onError: { [weak self] error in

            self?.isLoading.accept(false)
            self?.receivedError.accept(error)

        }).disposed(by: disposeBag)

在这种情况下,来自两个请求的所有错误都将在 onError 闭包中结束,我如何在不同的 onError 闭包中处理来自 minMaxReq 的错误?

我的目标是同时发出 2 个请求,但使用不同的闭包处理它们的错误。我怎样才能做到这一点? 谢谢

【问题讨论】:

    标签: ios swift zip observable


    【解决方案1】:

    您是否尝试过 materialize 运算符?也许它对您需要的实现很有用。附上一个常用的例子:

    let valid = network.getToken(apikey)
                .flatMap{ token in self.verifyToken(token).materialize()}
                .share()
    
    valid
        .compactMap { $0.element }
        .subscribe(onNext: { data in print("token is valid:", data) })
        .disposed(by: disposeBag)
    
    valid
        .compactMap { $0.error?.localizedDescription }
        .subscribe(onNext: { data in print("token is not valid:", data) })
        .disposed(by: disposeBag)
    

    这样,您可以将流分成两部分并给予适当的处理。

    另一个选项可能是在 minMaxReq 操作中操纵错误事件。类似于:

    let minMaxReq = networkProvider.getMinMaxAmortization(id: id)
                            .catchError({ error in Observable.empty()
                            .do(onCompleted: { /* Do anything with no side effect*/  }) })
    
    let emitExtractReq = networkProvider.getEmitExtract(id: id)
    
    Observable.zip(...)
    

    这是一篇解释更多细节的文章Handling Errors in RxSwift

    【讨论】:

    • 这听起来很有希望。但我不确定如何将其应用于我的案例。我需要 onNext 闭包中的代码仅在两个请求都完成时运行,所以我可以关闭 isLoading 动画。
    • 如何确保两个请求同步?我知道如何使用 group 等来做到这一点,但它有点复杂。我认为必须有一种 RxSwift 方法来处理我错过的这种情况
    • 我知道我已经用另一个可能的选项更新了答案,最好的问候。
    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多