点击UIButton报navigationController需在主线程调用错误如何解决
报错原因
- iOS系统规定所有UI相关操作必须在主线程中执行,否则会出现线程安全问题,该报错是Xcode的主线程检查器检测到非主线程操作UI的提示。
- 代码中
URLSession.shared.dataTask的回调闭包默认在后台线程执行,你在这个闭包里直接执行了self.navigationController?.pushViewController这个UI跳转操作,同时对MapViewController的属性赋值也属于和UI展示相关的操作,因此触发了报错。
解决方法
只需要把闭包内所有和UI相关的代码,包装到主线程调度的代码块中即可,修改后对应代码如下:
do{ let decodedData = try decoder.decode(CordinateData.self, from: safeData) let lat = decodedData.data[0].x let lon = decodedData.data[0].y let doubleLat = Double(lat) ?? 0.0 let doubleLon = Double(lon) ?? 0.0 // 调度到主线程执行UI相关操作 DispatchQueue.main.async { nc.lon = doubleLon nc.lat = doubleLat self.navigationController?.pushViewController(nc, animated: true) //self.present(nc, animated: true, completion: nil) print(doubleLat) print(doubleLon) } }catch{ print("error") }
内容的提问来源于stack exchange,提问作者biyush shrestha
相关产品推荐
相关产品推荐

