【问题标题】:Why calling a dialog with a struct drops this exception?为什么使用结构调用对话框会丢弃此异常?
【发布时间】:2022-08-11 23:11:14
【问题描述】:

我试图重定向这个在结构中解码的 API 调用的输出,但是当我尝试使用数据创建一个对话框时,它给了我这个奇怪的异常。如您所见,API 返回数据,但只有在我创建对话框时才会看到此异常。你能帮助我吗?

代码:

struct rspServerInfo: Codable{
        let ok: Bool
        let info: String
    }
    @IBAction func backendDetails(_ sender: Any) {
        
        guard let url = URL(string: \"http://\\(hostname):\\(port)/STOInfo/ServerInfo\")else{
            return
        }

        var request = URLRequest(url: url)
        request.httpMethod = \"POST\"
        request.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")
        let body: [String: AnyHashable] = [
            \"username\": username,
            \"password\": password,
        
        ]
        
        request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
        let task = URLSession.shared.dataTask(with: request) {data, _, error in
            
            guard let data=data, error == nil else{
                return
            }
            do{
                let response = try JSONDecoder().decode(rspServerInfo.self, from: data)
                print(\"SUCCESS: \\(response)\")
                let dialogMessage = UIAlertController(title: \"Backend details\", message: response.info, preferredStyle: .alert)
                    let ok = UIAlertAction(title: \"OK\", style: .default, handler: { (action) -> Void in
                         print(\"Ok button tapped\")
                    })
                dialogMessage.addAction(ok)
                self.present(dialogMessage, animated: true, completion: nil)
            }
            catch{
                print(error)
                let dialogMessage = UIAlertController(title: \"Backend details\", message: \"Error retreiving.\", preferredStyle: .alert)
                    let ok = UIAlertAction(title: \"OK\", style: .default, handler: { (action) -> Void in
                         print(\"Ok button tapped\")
                    })
                dialogMessage.addAction(ok)
                self.present(dialogMessage, animated: true, completion: nil)
            }
        }
        task.resume()
    }

    标签: ios swift storyboard


    【解决方案1】:

    错误消息提供了一个很大的线索:

    由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'修改 布局引擎不得在其后的后台线程中执行 已从主线程访问。以未捕获的方式终止 NSException 类型的异常

    URLRequest 在后台线程上异步运行,包括其完成处理程序。您(通常)不能在主线程之外进行 UI 工作。要显示结果,您需要将操作推回主线程:

    DispatchQueue.main.async {
       // do UI work
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多