在阅读了下面的教程之后,我正在尝试将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(),它就可以正常工作。
关于如何解决这个问题的任何线索都将不胜感激。

最佳答案

sendError导致信号终止。从ReactiveCocoa Design Guidelines开始:
在RAC中,错误事件具有异常语义。当一个错误被发送到一个信号上时,它将立即被转发到所有相关信号,导致整个链终止。
如果要从创建的RACSignal中sendError,则需要使用类似于-catch:运算符的东西来处理它下游(在subscriberext之前),这样它就不会终止信号。

09-12 17:37