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

Swift视图加载时JSON解析异常:代码执行流程异常排查求助

问题根源:同步网络请求阻塞主线程

兄弟,你遇到的这个现象本质是主线程被同步网络请求卡住了!

为什么会出现这种情况?

viewDidLoad是在App的主线程执行的,如果你在里面用了同步网络请求(比如NSURLConnection的同步方法,或者错误地把异步请求改成了同步等待),主线程会被彻底阻塞——它会一直等着网络请求返回结果,这段时间里App没法处理任何UI操作、也没法继续执行后续代码,所以你调试时会看到程序“停在var sec=""就退出方法”,其实只是主线程被卡得没反应了,等2-3秒网络请求完成后,才会继续执行后面的do循环。

怎么修复?

把同步请求改成异步请求,用Swift推荐的URLSession异步方法,既不会阻塞主线程,还能正常处理网络数据。给你改好的代码示例:

override func viewDidLoad() {
    super.viewDidLoad()
    let urlJsonToken2 = "https://services.domain.com/"
    
    // 先校验URL合法性,避免崩溃
    guard let myURL2 = URL(string: urlJsonToken2) else {
        print("URL格式错误")
        return
    }
    
    // 发起异步网络请求
    let task = URLSession.shared.dataTask(with: myURL2) { [weak self] data, response, error in
        // 避免循环引用
        guard let self = self else { return }
        
        // 处理请求错误
        if let error = error {
            print("网络请求失败:\(error.localizedDescription)")
            return
        }
        
        // 校验数据是否存在
        guard let responseData = data else {
            print("未获取到有效数据")
            return
        }
        
        // 解析JSON并存入数组(Swift里用Array替代ArrayList)
        do {
            // 根据你的JSON实际结构调整解析方式,这里假设是数组类型
            if let jsonArray = try JSONSerialization.jsonObject(with: responseData, options: []) as? [Any] {
                // 这里可以把jsonArray赋值给你的数组变量
                // 注意:如果要更新UI,必须切回主线程!
                DispatchQueue.main.async {
                    // 比如 self.yourArray = jsonArray
                    // 或者更新UI组件
                }
            }
        } catch {
            print("JSON解析失败:\(error.localizedDescription)")
        }
    }
    // 启动请求
    task.resume()
}

额外注意点

  1. 永远不要在主线程做同步网络请求,会导致App卡顿甚至被系统判定为无响应。
  2. 解析完数据后如果要更新UI,一定要用DispatchQueue.main.async切回主线程——UI操作只能在主线程执行,否则会出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:08