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

调用API获取数据并在TableViewCell展示失败求助

问题排查与修复方案

核心问题点

  • 重复定义函数:代码中存在两个完全一致的downloadJSON函数,会触发编译错误,导致程序无法正常运行。
  • 错误信息缺失:
    • 网络请求失败或无数据时直接返回,未打印任何错误详情,无法定位问题。
    • JSON解码失败仅打印模糊的"JSON Error",看不到具体报错原因。
  • JSON解析逻辑冲突:先尝试将JSON转为[String: Any],再用JSONDecoder解码为数组类型[apiData].self,若API返回的是字典包裹数组的结构,会直接解码失败。
  • 不安全操作与冗余代码:
    • 使用url!强制解包URL,存在崩溃风险;已通过guard判断error == nil,后续重复判断完全多余。

修复后的代码

// 仅保留一个downloadJSON函数
func downloadJSON(completed: @escaping () -> Void) {
    // 安全处理URL,避免强制解包
    guard let url = URL(string: "https://gydo.me/api/api/User/index") else {
        print("URL格式无效")
        return
    }

    URLSession.shared.dataTask(with: url) { data, response, error in
        // 优先处理网络错误
        if let error = error {
            print("网络请求失败: \(error.localizedDescription)")
            return
        }

        // 确保获取到有效数据
        guard let data = data else {
            print("未获取到有效数据")
            return
        }

        // 打印原始返回数据,方便排查结构问题
        if let rawJsonString = String(data: data, encoding: .utf8) {
            print("API原始返回: \(rawJsonString)")
        }

        do {
            // 注意:需根据API实际返回结构调整解码逻辑
            // 情况1:API直接返回数组(如 [{"id":1}, {"id":2}])
            self.detail = try JSONDecoder().decode([ApiData].self, from: data)
            
            // 情况2:API返回字典包裹数组(如 {"code":200, "data": [{"id":1}]}),需先定义对应模型
            // struct ApiResponse: Codable {
            //     let code: Int
            //     let data: [ApiData]
            // }
            // let response = try JSONDecoder().decode(ApiResponse.self, from: data)
            // self.detail = response.data

            DispatchQueue.main.async {
                completed()
            }
        } catch {
            // 打印完整解码错误,便于定位问题
            print("JSON解码失败: \(error)")
        }
    }.resume()
}

// 确保ApiData模型与API返回字段匹配
struct ApiData: Codable {
    // 示例:根据API实际字段添加属性,注意字段名大小写和类型
    // let id: Int
    // let name: String
}

关键排查步骤

  1. 用浏览器或接口调试工具请求目标API,确认返回的JSON结构,确保解码模型与之匹配。
  2. 检查ApiData模型的字段名、类型是否完全对应API返回,若API使用下划线命名,可设置JSONDecoder的keyDecodingStrategy = .convertFromSnakeCase适配。
  3. 确认设备网络正常,App已获得网络访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:23