首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxAlamofire +组合信号

RxAlamofire +组合信号
EN

Stack Overflow用户
提问于 2016-03-11 18:04:13
回答 1查看 1.9K关注 0票数 1

我有一个简单的服务器请求,我希望过滤并生成一个新的、可观察的、用JSON数据验证请求的请求。

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

服务器响应:

代码语言:javascript
复制
<NSHTTPURLResponse: 0x7fb2d2617850> { URL: http://service-.herokuapp.com/--} { status code: 200, headers ...

杰森:

代码语言:javascript
复制
{"system": {"code": "401","message": "Access Not Authorized"}}

我的rx请求是:

代码语言:javascript
复制
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时发送事件错误时,第一个信号永远不会完成或失败。我该怎么做?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-12 12:16:48

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

您需要更新flatMapLatest代码,以避免在发生错误后发送onCompleted()

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

另一个可能简化链的注释:您可以代替在flatMapLatest方法中创建一个新的flatMapLatest,而代之以抛出的map操作。

代码语言:javascript
复制
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事件的转发,而您的块只关注一件事情,即生成错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35946969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档