Alamofire超时处理:如何实现用户点击重试按钮后触发请求重发
Alamofire 等待用户交互后重试的实现方案
核心逻辑:Alamofire 提供的retry方法入参里的completion闭包支持异步调用,不需要在方法内同步返回结果,只需要将闭包暂存,等待用户点击弹窗按钮后再触发回调即可。
具体实现步骤
1. 前置错误类型过滤
首先判断当前错误是否为超时错误,仅超时场景触发弹窗逻辑,其他错误直接走不重试逻辑即可:
public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { // 先判断是否是超时错误 guard let urlError = error.asAFError?.underlyingError as? URLError, urlError.code == .timedOut else { completion(.doNotRetry) return }
2. 主线程弹出自定义提示框,暂存completion闭包
切换到主线程操作UI,将completion闭包传递到弹窗的点击回调中:
// 切换到主线程弹框 DispatchQueue.main.async { // 你的自定义弹窗实例 let timeoutAlert = CustomTimeoutAlertView() // 取消按钮点击回调 timeoutAlert.cancelAction = { completion(.doNotRetry) } // 重试按钮点击回调 timeoutAlert.retryAction = { // 重试次数可以自己指定,这里示例无延迟重试1次 completion(.retryWithDelay(0)) } // 展示弹窗 timeoutAlert.show() } }
注意事项
- 不要直接修改
Session.default的全局配置,建议单独生成自定义Session实例使用,避免影响其他全局请求:
// 正确的自定义Session示例 let config = URLSessionConfiguration.af.default config.timeoutIntervalForRequest = 10 // 注意实际场景不要设置过短的超时时间,避免误触发 let customSession = Session(configuration: config, interceptor: YourCustomInterceptor())
- 如果存在多个请求同时超时的场景,建议做弹窗队列处理,避免同时弹出多个提示框
- 弹窗相关实例要注意内存管理,避免循环引用导致内存泄漏
内容的提问来源于stack exchange,提问作者nirav
相关产品推荐
相关产品推荐

