我有一个简单的服务器请求,我想过滤并生成一个新的可观察对象,使用 JSON 数据验证请求。
我必须这样做,因为即使我的请求无效,我的服务器响应也会返回状态代码 200。但我可以在我的 Json 响应中过滤这个结果:
服务器响应:
<NSHTTPURLResponse: 0x7fb2d2617850> { URL: http://service-.herokuapp.com/--} { status code: 200, headers ...
杰森:
{"system": {"code": "401","message": "Access Not Authorized"}}
我的 rx 请求是:
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 之间)时,我发送一个事件下一个,在事件完成之后,这将完成此信号,第一个信号也完成。但是,当我在验证 JSON 时发送事件错误时,第一个信号永远不会完成或失败。我该怎么做?
谢谢
一个可观察量只能发送一个已完成的事件或一个错误事件。
您需要更新flatMapLatest
代码,以便在出现错误后不发送onCompleted()
。
if 200..<300 ~= statusCode {
observer.onNext((response,data))
observer.onCompleted()
}else{
observer.onError(NSError(domain: "test", code: 1, userInfo: nil))
}
另一个评论,可能会简化链:您可以将其替换为抛出的map
操作,而不是在flatMapLatest
方法中创建新Observable
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
事件的转发,并且您的块只关注一件事,从而产生错误。