Swift 如何处理URLSession.shared.dataTask中中断的XPC连接

Swift 如何处理URLSession.shared.dataTask中中断的XPC连接,swift,xcode,Swift,Xcode,这是我的代码,当服务器关闭时,我试图通过它捕获错误: let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in if error != nil { self.displayMessage(userMessage: "Could not successfu

这是我的代码,当服务器关闭时,我试图通过它捕获错误:

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            if error != nil
            {
                self.displayMessage(userMessage: "Could not successfully perform this request. Please check yourr internet connection.")
                print("error=\(String(describing: error))")
                return
            }

            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                if let parseJSON = json {
                    if parseJSON["errorMessageKey"] != nil
                    {
                        self.displayMessage(userMessage: parseJSON["errorMessage"] as! String)
                        return
                    }                        
                    ...  

                } else {
                    self.displayMessage(userMessage: "Could not successfully perform this request. Please try again later")
                }

            } catch {
                self.displayMessage(userMessage: "Could not successfully perform this request. Please try again later")
                print(error)
            }
        }
task.resume()
但在控制台中,我得到的是“XPC连接错误”,而不是显示警报

发生此错误时,如何显示警报

我的环境:

Swift:5

Xcode:11.5


目标部署:13.4

假设
displayMessage
没有问题,因为您没有提供代码

我建议您在主线程上调用包含uikitapi的代码。由于总是在后台线程上调用
dataTask
完成块。我建议您在调用这个函数时,应该始终在主线程上运行与UIKit相关的代码

仅从应用程序的主线程或主调度中使用UIKit类 排队,除非另有说明。这一限制尤其重要 适用于从UIResponder派生的类或涉及 以任何方式操纵应用程序的用户界面

请查看更新的代码段

let task=URLSession.shared.dataTask(with:request){(data:data?,response:URLResponse?,error:error?)在
//它确保rest代码放在主线程的run中,我假设displayMessage函数具有与UIKit框架相关的代码。
DispatchQueue.main.async{
如果错误!=nil
{
self.displayMessage(userMessage:“无法成功执行此请求。请检查您的internet连接。”)
打印(“错误=\(字符串(描述:错误)))
返回
}
做{
让json=try JSONSerialization.jsonObject(使用:data!,选项:.mutableContainers)作为?NSDictionary
如果让parseJSON=json{
如果parseJSON[“errorMessageKey”]!=nil
{
displayMessage(userMessage:parseJSON[“errorMessage”]as!String)
返回
}
}否则{
self.displayMessage(userMessage:“无法成功执行此请求。请稍后重试”)
}
}抓住{
self.displayMessage(userMessage:“无法成功执行此请求。请稍后重试”)
打印(错误)
}
}
}
task.resume()

假设
displayMessage
没有问题,因为您没有提供代码

我建议您在主线程上调用包含uikitapi的代码。由于总是在后台线程上调用
dataTask
完成块。我建议您在调用这个函数时,应该始终在主线程上运行与UIKit相关的代码

仅从应用程序的主线程或主调度中使用UIKit类 排队,除非另有说明。这一限制尤其重要 适用于从UIResponder派生的类或涉及 以任何方式操纵应用程序的用户界面

请查看更新的代码段

let task=URLSession.shared.dataTask(with:request){(data:data?,response:URLResponse?,error:error?)在
//它确保rest代码放在主线程的run中,我假设displayMessage函数具有与UIKit框架相关的代码。
DispatchQueue.main.async{
如果错误!=nil
{
self.displayMessage(userMessage:“无法成功执行此请求。请检查您的internet连接。”)
打印(“错误=\(字符串(描述:错误)))
返回
}
做{
让json=try JSONSerialization.jsonObject(使用:data!,选项:.mutableContainers)作为?NSDictionary
如果让parseJSON=json{
如果parseJSON[“errorMessageKey”]!=nil
{
displayMessage(userMessage:parseJSON[“errorMessage”]as!String)
返回
}
}否则{
self.displayMessage(userMessage:“无法成功执行此请求。请稍后重试”)
}
}抓住{
self.displayMessage(userMessage:“无法成功执行此请求。请稍后重试”)
打印(错误)
}
}
}
task.resume()