我正在使用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()
}
非常感谢任何帮助。
答案 0 :(得分:1)
我认为在工作线程中调用send
存在问题。
您可以尝试在主线程中调用调用:
DispatchQueue.main.async {
self.sendErrorCodeEmail("There was an error")
}