You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:30:03