所以我的用例是,我有一个HTTP请求(使用-[NSURLSession rac_dataWithRequest:]
触发),它可以返回状态码403。
当发生这种情况时,我想捕获它,并重定向到另一个请求身份验证令牌的SignalProducer。当SignalProducer成功完成时,我希望重定向回原始的rac_dataWithRequest。
我怎么做最好?我用的是reactivecocoa4。2.
您是否需要在重试之前将身份验证令牌交还给原始请求?如果是,那么这对你没有帮助,对不起。
我假设您只需要触发一次身份验证请求,然后重试原始请求。例如,您的认证请求设置HTTP客户端的HTTP授权头,以便下一个请求自动授权…
这个要点有一个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
…