【问题标题】:flattenMap and error handling in ReactiveCocoa with swift使用 swift 在 ReactiveCocoa 中进行 flattenMap 和错误处理
【发布时间】:2015-02-21 21:23:57
【问题描述】:

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

_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: {})

当在flattenMap 中调用sendError() 时,我按下按钮时不再发出信号。只要我只发出sendNext()sendCompleted(),它就可以正常工作。

任何有关如何解决此问题的线索将不胜感激。

【问题讨论】:

    标签: ios swift reactive-cocoa frp alamofire


    【解决方案1】:

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

    在 RAC 中,错误事件具有异常语义。当在信号上发送错误时,它会立即转发给所有依赖的信号,从而导致整个链终止。

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

    【讨论】:

    • 你是对的。发送错误会取消订阅事件流,防止它发生的唯一方法是捕获并发出一个空的 RACSignal。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2011-06-04
    相关资源
    最近更新 更多