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() }
额外注意点
- 永远不要在主线程做同步网络请求,会导致App卡顿甚至被系统判定为无响应。
- 解析完数据后如果要更新UI,一定要用
DispatchQueue.main.async切回主线程——UI操作只能在主线程执行,否则会出问题。
内容的提问来源于stack exchange,提问作者Kuroiteiken
相关产品推荐
相关产品推荐

