是否可以使用RxSwift和Moya映射到“后备”可解码?

问题描述 投票:0回答:1

我使用RxMoya作为我的应用程序的网络层,我有一个案例,服务器可以发送预期的响应(让我们说一个User),或者一个错误对象,两者都有状态代码200.例如:

{
  "name": "john doe",
  "username": "john_doe"
}

可能是预期的反应和

{
  "error": {
    "code": 100,
    "message": "something went wrong™"
  }
}

可能是错误。

网络适​​配器的相关部分可能如下所示:

    return provider
        .rx
        .request(MultiTarget.target(target))
        .map(User.self)
        // if above fails, try:
        // .map(UserError.self)
        .asObservable()

有没有办法首先尝试和.map(User.self),如果失败,尝试在同一个操作链中的.map(UserError.self)?换句话说,我可以使用Rx提供替代映射模型吗?

ios rx-swift rx-cocoa moya
1个回答
1
投票

你可以使用flatMap来做到这一点。像这样的东西:

    return provider
    .rx
    .request(MultiTarget.target(target))
    .flatMap { response -> Single<User> in
        if let responseType = try? response.map(User.self) {
            return Single.just(responseType)
        } else if let errorType = try? response.map(UserError.self) {
            return Single.error(errorType.error)
        } else {
            fatalError("⛔️ We don't know how to parse that!")
        }
     }

顺便说一下,返回错误的状态码200不正确。

© www.soinside.com 2019 - 2024. All rights reserved.