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

时间:2018-08-22 10:49:32

标签: ios rx-swift rx-cocoa moya

我正在将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提供替代的映射模型吗?

1 个答案:

答案 0 :(得分: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不正确。