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

时间:2015-02-21 21:23:57

标签: ios swift reactive-cocoa frp alamofire

阅读以下教程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 个答案:

答案 0 :(得分:3)

sendError导致信号终止。来自ReactiveCocoa Design Guidelines

  

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

如果你想从你创建的RACSignal中sendError,你需要使用类似-catch:运算符的东西来处理它下游(在subscribeNext之前),所以它不会终止信号。