求助: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
相关产品推荐
相关产品推荐

