Swift多请求返回相同结果:同步API调用响应正常但返回ID一致
问题原因
- 核心问题是响应数据解析逻辑错误:你调用的WooCommerce产品接口返回的是标准JSON格式二进制数据,
request_data[0]取的是二进制数据的第一个字节,转字符串后得到的是JSON的首字符(通常是[或者{),和实际接口返回的产品ID无关,所以每次取值都相同。 - 次要问题是URLSession默认缓存策略可能返回旧缓存数据,以及多处强制解包存在崩溃风险。
修复方案
1. 修正接口请求方法,直接解析返回的产品ID
func fetchIDbySKU(name: String, color: String) -> Int? { let sku = name + ":" + color // 避免强制解包崩溃 guard let appendedsku = sku.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: "https://www.link.com/wp-json/wc/v1/products?sku=" + appendedsku) else { return nil } let semaphore = DispatchSemaphore(value: 0) var productId: Int? var request = URLRequest(url: url, timeoutInterval: 10) // 显式设置忽略缓存,每次请求最新数据 request.cachePolicy = .reloadIgnoringLocalCacheData request.addValue("Basic secret token", forHTTPHeaderField: "Authorization") request.httpMethod = "GET" let task = URLSession.shared.dataTask(with: request) { data, response, error in defer { semaphore.signal() } // 校验响应 guard let data = data, error == nil, let jsonArray = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]], // WooCommerce按SKU查询返回的是数组,取第一个元素的id字段 let firstProduct = jsonArray.first, let id = firstProduct["id"] as? Int else { print("请求或解析失败: \(error?.localizedDescription ?? "未知错误")") return } productId = id } task.resume() semaphore.wait() return productId }
注意:用信号量实现同步请求会卡住当前线程,禁止在主线程调用该方法,否则会导致界面无响应,更推荐使用异步回调的方式实现接口请求。
2. 修正调用逻辑
guard let productId = fetchIDbySKU(name: name, color: color_name) else { // 处理请求/解析失败的情况 return } parts_list.append(Item(product_id: String(productId), quantity: quantity))
内容的提问来源于stack exchange,提问作者Im__Ruben
相关产品推荐
相关产品推荐

