问题描述
我会用 combine 复制 Alamofire 拦截器的 Alamofire 重试功能。这个函数应该以这种方式工作:
func retry(_ request: Request,for session: Session,dueto error: Error,completion: @escaping (RetryResult) -> Void) {
//Async code
completion(.retry)
}
例如,如果出现错误,我应该刷新此 func 中的令牌,然后调用闭包。在我的网络管理器中,我应该检查关闭并重试呼叫。
我试图用Combine 复制这个逻辑。我没有关闭,而是Future
:
open func retry(_ response: URLResponse,for session: URLSession,dueto error: Error) -> AnyPublisher<RetryResultStruct,Error> {
testRefresh().flatMap { (success) in
return
Deferred {
Future<RetryResultStruct,Error> { promise in
if success {
promise(.success(RetryResultStruct(retryResult: .doNotRetry)))
} else {
promise(.failure(error))
}
}
}
}
.erasetoAnyPublisher()
}
我不明白如何组合在一起。我的 Combine 经理以这种方式工作:
func send(request: Request) -> AnyPublisher<Data,WebServiceError> {
let finalRequest = self.interceptor?.adapt(request.urlRequest)
self.interceptor?.logger.logRequest(urlRequest: finalRequest!)
return (self.session!.dataTaskPublisher(for: finalRequest!)
.tryMap { data,response -> Data in
guard let httpResponse = response as? HTTPURLResponse else { throw WebServiceError.nonHTTPResponse }
let statusCode = httpResponse.statusCode
guard (200..<300).contains(statusCode) else { throw WebServiceError.incorrectStatusCode(statusCode: statusCode,response: response) }
return data
}
.mapError{ (error) -> WebServiceError in
return error.mapToWebServiceError()
})
.erasetoAnyPublisher()
}
我编写了传递给我的请求管理器的拦截器。但我不明白如何组合在一起。 如何建议实现这一目标?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)