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

Swift UI测试:实现AccessToken获取的5次重试循环方案问询

问题场景

在UI测试流程中,我们通过传参让应用调用API创建新用户,获取用户的AccessToken后以登录态启动应用。但后端存在AccessToken就绪延迟问题,耗时波动极大——有时仅需毫秒级,有时会超过1秒。需要为获取AccessToken的操作添加最多5次、每次间隔1秒的重试逻辑。

现有代码与函数签名

原代码片段:

guard let accessToken = try? await UITestsNetwork.shared.autoLogin(email: credentials.email, password: credentials.password).async()
else {
    return
}
intializeLogin(with: accessToken)

autoLogin函数签名:

autoLogin(email: String, password: String) -> AnyPublisher<AccessToken, Error>

解决方案代码

以下是符合需求的Swift异步重试实现:

var accessToken: AccessToken?
let maxRetries = 5

for attempt in 0..<maxRetries {
    do {
        accessToken = try await UITestsNetwork.shared.autoLogin(email: credentials.email, password: credentials.password).async()
        break // 成功获取token,跳出循环
    } catch {
        print("第\(attempt + 1)次获取AccessToken失败:\(error.localizedDescription)")
        if attempt < maxRetries - 1 {
            // 非最后一次失败,等待1秒后重试
            try? await Task.sleep(nanoseconds: 1_000_000_000)
            Task.yield()
        }
    }
}

guard let token = accessToken else {
    print("已尝试\(maxRetries)次,仍无法获取AccessToken")
    return
}

intializeLogin(with: token)

代码说明

  • 用for循环严格控制最多5次重试,成功获取token后立即跳出循环
  • 使用Task.sleep替代阻塞式sleep,避免占用异步线程(注意参数单位为纳秒)
  • 仅在非最后一次失败时执行等待逻辑,减少不必要的延迟
  • 每次失败打印错误详情,方便测试调试
  • 最终校验token是否获取成功,失败则直接返回,成功则初始化登录流程

内容的提问来源于stack exchange,提问作者destr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:04