异步调用不适用于 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")
}
我正在使用 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")
}