将信号重定向到另一个信号

时间:2015-09-24 06:19:11

标签: nsurlsession reactive-cocoa

所以我的用例是我有一个HTTP请求(使用-[NSURLSession rac_dataWithRequest:]触发),可以返回状态代码403.

当发生这种情况时,我想抓住它,并重定向到另一个请求身份验证令牌的SignalProducer。当SignalProducer成功完成时,我想重定向回原来的rac_dataWithRequest。

我最好怎么做?我正在使用ReactiveCocoa 4.x和Swift 2。

1 个答案:

答案 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时...