swift ReactiveCocoa 中的 flattenMap 和错误处理
flattenMap and error handling in ReactiveCocoa with swift
阅读以下教程后 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: {})
当在 flattenMap
中调用 sendError()
时,当我按下按钮时,信号不再发出。只要我只发出 sendNext()
和 sendCompleted()
,它就可以正常工作。
任何有关如何解决此问题的线索都将不胜感激。
sendError
导致信号终止。来自 ReactiveCocoa Design Guidelines:
In RAC, error events have exception semantics. When an error is sent on a signal, it will be immediately forwarded to all dependent signals, causing the entire chain to terminate.
如果你想从你创建的 RACSignal 中 sendError
你需要使用类似 -catch:
运算符的东西在下游(在 subscribeNext 之前)处理它,这样它就不会终止信号.
阅读以下教程后 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: {})
当在 flattenMap
中调用 sendError()
时,当我按下按钮时,信号不再发出。只要我只发出 sendNext()
和 sendCompleted()
,它就可以正常工作。
任何有关如何解决此问题的线索都将不胜感激。
sendError
导致信号终止。来自 ReactiveCocoa Design Guidelines:
In RAC, error events have exception semantics. When an error is sent on a signal, it will be immediately forwarded to all dependent signals, causing the entire chain to terminate.
如果你想从你创建的 RACSignal 中 sendError
你需要使用类似 -catch:
运算符的东西在下游(在 subscribeNext 之前)处理它,这样它就不会终止信号.