繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM