gpt4 book ai didi

swift - RxAlamofire + 组合信号

转载 作者:搜寻专家 更新时间:2023-11-01 06:40:34 35 4
gpt4 key购买 nike

我有一个简单的服务器请求,我想过滤并生成一个新的 Observable 以使用 JSON 数据验证请求。

我必须这样做,因为即使我的请求无效,我的服务器响应也会返回状态代码 200。但我可以在我的 Json 响应中过滤此结果:

服务器响应:

<NSHTTPURLResponse: 0x7fb2d2617850> { URL: http://service-.herokuapp.com/--} { status code: 200, headers ...

JSON:

{"system": {"code": "401","message": "Access Not Authorized"}}

我的接收请求是:

let manager = Manager.sharedInstance
return manager.rx_request(method, "\(ApiRoutes.baseURL)\(path)", parameters: parameters)
// then validate server response
.flatMap{
$0.validate(statusCode: 200..<300)
.rx_responseData()
}
// then I create a new Observable validating the received json
.flatMapLatest { response, data in
return Observable.create{ observer in
let json = JSON(data: data)

let statusCode = Int(json["system"]["code"].numberValue) ?? 400

if 200..<300 ~= statusCode {
observer.onNext((response,data))
}else{
observer.onError(NSError(domain: "test", code: 1, userInfo: nil))
}
observer.onCompleted()
return NopDisposable.instance
}
}
.observeOn(MainScheduler.instance)

我的问题是:当我的 json 通过(状态代码在 200 到 300 之间)时,我发送了一个 Event Next 并且在 Event Complete 之后,这完成了这个信号并且第一个信号也完成了。但是当我在验证我的 JSON 时发送事件错误时,第一个信号永远不会完成或失败。我该怎么做?

谢谢

最佳答案

一个可观察对象只能发送一个完成的事件一个错误事件。

您需要更新您的 flatMapLatest不发送代码 onCompleted()出错后。

if 200..<300 ~= statusCode {
observer.onNext((response,data))
observer.onCompleted()
}else{
observer.onError(NSError(domain: "test", code: 1, userInfo: nil))
}

另一个可以简化链的评论:你可以,而不是创建一个新的 ObservableflatMapLatest方法,将其替换为 map抛出的操作

return manager.rx_request(method, "\(ApiRoutes.baseURL)\(path)", parameters: parameters)
// then validate server response
.flatMap{
$0.validate(statusCode: 200..<300)
.rx_responseData()
}
.map { (response, data) in
let json = JSON(data: data)
let statusCode = Int(json["system"]["code"].numberValue) ?? 400

if 200..<300 ~= statusCode {
return (response,data)
} else {
throw NSError(domain: "test", code: 1, userInfo: nil)
}
}

这样就不需要处理.Next的转发了和 .Completed你自己的事件,你的 block 只关注一件事,产生错误。

关于swift - RxAlamofire + 组合信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946969/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com