代码之家  ›  专栏  ›  技术社区  ›  pawurb

flattenMap和错误处理在ReactiveCocoa中使用swift

  •  0
  • pawurb  · 技术社区  · 9 年前

    阅读以下教程后 http://www.scottlogic.com/blog/2014/07/24/mvvm-reactivecocoa-swift.html 我正在尝试将ReactiveCocoa与Swift一起用于我的应用程序。按下按钮后,我请求检查服务器是否响应:

    _checkButton.rac_signalForControlEvents(UIControlEvents.TouchUpInside)
    .flattenMap({(text: AnyObject!) -> RACStream! in
      return RACSignal.createSignal({ (subscriber: RACSubscriber!) -> RACDisposable! in
        Alamofire.request(.GET, "http://google.com")
        .validate(statusCode: 200..<300)
        .response{ (_, _, _, error) in
          if(error == nil) {
            subscriber.sendNext(true)
            subscriber.sendCompleted()
          } else {
            subscriber.sendError(error)
          }
        })
    }).subscribeNextAs({ (value: AnyObject) -> () in
      println("success")
    }, error: { (error: NSError) -> () in
      println("error")
    }, completed: {})
    

    什么时候 sendError() 被调用 flattenMap 当我按下按钮时,信号不再发出。只要我发射,它就能正常工作 sendNext() sendCompleted() 只有

    任何关于如何解决这一问题的线索都将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  3
  •   Patrick Bacon    9 年前

    这个 sendError 导致信号终止。从 ReactiveCocoa Design Guidelines :

    在RAC中,错误事件具有异常语义。当在信号上发送错误时,它将立即转发到所有相关信号,导致整个链终止。

    如果你想 sendError(发送错误) 从创建的RACSignal中,您需要使用 -catch: 操作员在下游处理它(在subscribeNext之前),这样它就不会终止信号。