![](/img/trans.png)
[英]How to pass to URLSession.shared.dataTask called in a loop?
[英]How to handle XPC connection interrupted in URLSession.shared.dataTask
这是我的代码,当服务器关闭时,我试图通过它来捕获错误:
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
没有问题,因为您没有提供代码。
我建议您在主线程上调用具有 UIKit API 的代码。 因为dataTask
完成块总是在后台线程上调用。 我建议您在调用 function 时,进一步具有与 UIKit 相关的代码应始终在主线程上运行
除非另有说明,否则只能从应用的主线程或主调度队列中使用UIKit类。 此限制特别适用于从UIResponder派生的类或涉及以任何方式操纵应用程序用户界面的类。
查看更新的代码片段。
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
// It ensure rest code placed inside run on the main thread. I assume displayMessage function having the code related to UIKit framework.
DispatchQueue.main.async {
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.