所以我的用例是我有一个HTTP请求(使用-[NSURLSession rac_dataWithRequest:]
触发),可以返回状态代码403.
当发生这种情况时,我想抓住它,并重定向到另一个请求身份验证令牌的SignalProducer。当SignalProducer成功完成时,我想重定向回原来的rac_dataWithRequest。
我最好怎么做?我正在使用ReactiveCocoa 4.x和Swift 2。
答案 0 :(得分:0)
在重试之前,您是否需要将身份验证令牌传回原始请求?如果是,那么这对你没有帮助,抱歉。
我假设您只需要触发一次身份验证请求,然后重试原始请求。例如。您的身份验证请求设置HTTP客户端的HTTP Authorization标头,以便下一个请求被自动授权...
This gist包含Playground的内容,用于说明解决方案。这个要点是我四处寻找解决方案的结果,请求被嘲笑,......
假设您的请求有SignalProducer
:
let request = SignalProducer<Response, NSError> {
// Perform your request that needs authentication here
}
另一个用于您的身份验证请求:
let authorize = SignalProducer<Void, NSError> {
// Perform your request that needs authentication here
}
现在您可以使用flatMapErrors
(以前为catch
)和retry
:
request.flatMapError { error -> SignalProducer<String, NSError> in
if(error.code == 403) {
return authorize.then(SignalProducer(error: error))
} else {
return SignalProducer(error: error)
}
}.retry(1)
因此,我们会捕获原始请求的错误,如果错误代码为403
,我们会执行authorize
请求。然后,我们仍然转发了捕获的错误。否则,我们只是转发错误。
在authorize
请求很重要之后转发错误,否则retry
将不会重新启动原始请求。
但问题是,它会在每次错误时重试,而不仅仅是在原始请求返回403
时...