异步调用不使用URLSession

时间:2017-03-08 14:19:10

标签: swift nsurlsession backendless

我正在使用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)")
        })
    }

这完美无缺。

我的问题是当我使用带有URLSession的sendHTMLEmail时。如果由于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()
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为在工作线程中调用send存在问题。

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

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