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()