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

求助:Alamofire请求未完成时async函数提前返回初始值的问题

解决Alamofire异步请求导致函数提前返回值的问题

问题出在你用了Alamofire的回调式responseData方法——这个方法是异步执行的,函数会直接跳过请求流程走到return theNetPrice,此时网络请求还没完成,自然返回初始值0.0。而且回调闭包的返回类型是Void,根本没法直接返回Double,所以会报类型转换错误。

正确的做法是改用Alamofire支持async/await的API,让函数等待请求完成后再返回结果,完全贴合你定义的async -> Double?函数语义。修改后的代码如下:

struct GetPrice {
    static func getThePrice(book: String) async -> Double? {
        let url = "https://example.com"
        
        let headers: HTTPHeaders = [
            "accept": "application/xml",
            "Authorization": "Basic xxx",
            "Content-Type": "application/x-www-form-urlencoded"
        ]

        let body: [String: Any] = ["xxxxx"]

        do {
            // 用async/await版本的API,等待请求完成
            let response = try await AF.request(
                url,
                method: .post,
                parameters: body,
                encoding: URLEncoding.default,
                headers: headers
            ).serializingData().value
            
            // 处理返回数据,避免强制解包
            guard let s = String(data: response, encoding: .utf8) else {
                print("无法解析响应数据为字符串")
                return nil
            }
            
            let xml = XMLHash.parse(s)
            guard let priceText = xml["xxx"].element?.text, let netPrice = Double(priceText) else {
                print("解析价格失败")
                return nil
            }
            
            return netPrice
        } catch {
            // 处理请求错误
            print("请求失败: \(error)")
            if let afError = error as? AFError {
                print("状态码: \(afError.responseCode ?? -1)")
            }
            return nil
        }
    }
}

关键修改点:

  • 替换responseData回调为serializingData().value的await调用,让函数暂停等待请求完成,拿到结果后再继续执行。
  • 用do-catch捕获请求过程中可能抛出的错误,替代原来的回调式错误处理。
  • 去掉了冗余的全局变量,直接在请求完成后处理数据并返回结果。
  • 所有可选值都用guard let做安全处理,避免强制解包(!)导致的崩溃风险。

调用这个函数的时候,记得在async上下文里用await:

// 比如在View的task或者其他async函数中
if let price = await GetPrice.getThePrice(book: "某本书") {
    print("拿到价格: \(price)")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:13