如何在RxMoya中正确过滤成功状态代码

时间:2016-10-21 11:42:48

标签: swift rx-swift moya

我正在使用RxMoya,我想知道fiterSuccesfulStatusCodes的用法,我会尝试描述我的问题是什么......所以当你使用像这样的网络调用时

func getAllApps(gwId: Int) -> Observable<Response> {
    return provider.request(RestAPI.GetAllApps(gwId: gwId)).filterSuccessfulStatusCodes()
}

当您获得状态代码高于299的响应时,什么都不会发生,我的问题是我想向用户显示错误消息,但是当您检查filterSuccessfulStatusCodes执行的操作时:

public func filterSuccessfulStatusCodes() -> Observable<E> {
    return flatMap { response -> Observable<E> in
        return Observable.just(try response.filterSuccessfulStatusCodes())
    }
}

现在我们越来越接近我的问题了。所以filterSuccessfulStatusCodes的实现使用Moya.Resposne的公共实例函数来实现:

public func filterSuccessfulStatusCodes() throws -> Response {
    return try filterStatusCodes(200...299)
}

正如你所看到的,这个东西抛出异常...但是上面的函数,它没有重新抛出,它返回了通用类型E的Observable。

我的第一个问题,当函数没有抛出/重新抛出时,你怎么能使用返回Observable.just(尝试response.filterSuccessfulStatusCodes())。你可以使用try withou do / chatch吗?(我知道试试!/试试?你可以尝试,我只能想象重新抛出的情况)。

第二个问题,它有一种方法可以在可观察的水平上对错误状态代码做出反应。

谢谢

1 个答案:

答案 0 :(得分:1)

  • try response.filterSuccessfulStatusCodes()未在filterSuccessfulStatusCodes()的范围内使用,但在flatMap中使用。

    如果我们看一下flatMapObservable的定义,我们就会得到

    func flatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)
      -> Observable<O.E>
    
    此处

    selector会抛出,因此我们可以使用try

  • 当某个东西抛入可观察链时,observable将以错误结束。因此,您将能够对订阅调用的onError选择器中的不成功状态代码做出反应(或使用catchretry和其他操作错误的运算符。

    getAllApps(gwId: Int)
      .subscribe(onNext: {
        debugPrint("Success with \($0)")
      }, onError: { error in
        switch error {
        case Moya.Error.statusCode(let response):
          debugPrint("Invalid status code \(response.statusCode)")
        default:
          debugPrint("An error occured: \(error)")
        }
      })