异步调用不适用于 URLSession

Asynchronous Call Not Working with URLSession

我正在使用 URLSession 和一项名为 Backendless 的服务。 Backendless 与 Parse 非常相似。

Backendless 有一个消息服务,可以让你发送电子邮件。我在我的应用程序中使用它来报告错误。我创建了一个名为 sendErrorCodeEmail() 的方法,它调用 Backendless 方法。下面显示了一个简单的例子来说明它是如何工作的。

func callSendHTMLEmailInDelegate()
    {
        let errorCodeMessage = "There is an error."
        self.sendErrorCodeEmail(errorCodeMessage)
    }

func sendErrorCodeEmail(_ errorCode: String)
    {
        // Asynchronous Version
        let subject = "Error Called"
        let body = "\(errorCode)"
        let recipient = ["xx@xx.com"]

        self.backendless?.messagingService.sendHTMLEmail(subject, body: body, to: recipient, response: { (response : Any?) -> () in

            print("The error code email was sent successfully. \(response)")

        }, error:  { (fault : Fault?) -> () in

            print("The server reported a fault in the sendErrorCode email: \(fault)")
        })
    }

这非常有效。

我的问题是当我将 sendHTMLEmail 与 URLSession 一起使用时。如果由于 URL 错误而报告错误,我会调用相同的 sendErrorCodeEmail() 方法。问题是,Backendless 的 sendHTMLEmail() 方法没有执行。我已验证调用了 sendErrorCodeEmail()。

由于代码中唯一的区别是 URLSession 的使用,我想知道是否存在线程问题或我遗漏的其他问题。 sendHTMLEmail 是一种异步方法。还有一个同步版本,如果我在 sendErrorCodeEmail() 中调用它,它就可以工作。使用 URLSession 的基本代码如下。

func startSession()
    {
        // Start the connection with the URL that was passed in the unit method in the dataHandler.
        self.session = URLSession.shared
        let dataTask = self.session!.dataTask(with: self.sessionURL!, completionHandler: { (data, response, error) -> Void in

            if error == nil
            {
                if data != nil
                {
                    print("Data was downloaded successfully")
                }
            }
            else if error != nil
            {
                self.sendErrorCodeEmail("There was an error")
            }
        })

        dataTask.resume()
    }

如有任何帮助,我们将不胜感激。

我假设在工作线程中调用send有问题。

您可以尝试在主线程中调用:

DispatchQueue.main.async {
    self.sendErrorCodeEmail("There was an error")
}