我使用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提供替代映射模型吗?
你可以使用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不正确。