Ios 是否有可能映射到“a”;“撤退”;使用RxSwift和Moya可解码?

Ios 是否有可能映射到“a”;“撤退”;使用RxSwift和Moya可解码?,ios,rx-swift,rx-cocoa,moya,Ios,Rx Swift,Rx Cocoa,Moya,我将RxMoya用于我的应用程序的网络层,服务器可以发送预期的响应(比如用户),也可以发送错误对象,两者的状态代码都是200。例如: { "name": "john doe", "username": "john_doe" } 可能是预期的反应和 { "error": { "code": 100, "message": "something went wrong™" } } 可能是错误 网络适配器的相关部分可能如下所示: return provider

我将RxMoya用于我的应用程序的网络层,服务器可以发送预期的响应(比如
用户
),也可以发送错误对象,两者的状态代码都是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提供一个替代的映射模型吗?

您可以使用
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!")
        }
     }
返回提供程序
.rx
.request(多目标.target(目标))
.flatMap{response->Single-in
如果let responseType=try?response.map(User.self){
返回单身。仅(responseType)
}如果let errorType=try?response.map(UserError.self),则为else{
返回Single.error(errorType.error)
}否则{
法塔莱罗(“⛔️ 我们不知道如何解析它!)
}
}

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

对不起,不知怎么的,我错过了你的答案。问题是,我想在第一种情况下返回
Single.just(user)
,在第二种情况下返回
Single.error(errorMessage)
。在您的代码中,如果让user=user.self,行
做什么?好的,明白了。因为你应该得到分数,所以我在接受你的答案之前先对你的答案做了一些修改。谢谢好的,我认为
User.self
是可选的,并且使用
if let
进行展开。但是可以,您可以返回
Single.just(user)
Single.error
,但是错误应该有
error
对象,而不是字符串。此外,如果
flatMap
的返回类型为
Single
,则可以直接键入
。just(user)
。error(error)