2017-03-08 60 views
0

我与URLSession工作,一个叫Backendless服务工作。 Backendless与Parse非常相似。异步调用不与URLSession

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 = ["[email protected]"] 

     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() 
    } 

任何帮助将不胜感激。

+0

看代码,这样只会达到'self.sendErrorCodeEmail(“有错误”)'代码时误差不无,还有另一种情况,错误不是零,但数据是零,你没有覆盖。添加额外的打印语句/断点并确保代码已到达。如果它达到了代码而不工作,那么告诉我们发生了什么,你会得到错误吗? – Scriptable

+0

@Scriptable代码被简化以便于阅读。生产代码涵盖上述问题。虽然好点。我很欣赏这些意见。我不打算误导人。 – jonthornham

+0

无后顾之忧,只是想充分了解的情况下,看起来像它应该工作 – Scriptable

回答

1

我认为有一个在工作线程调用send问题。

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

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

辉煌。谢谢。你有新的发送是在工作线程上的原因吗?这是默认操作吗?将异步调用放在除main之外的线程中? – jonthornham

+0

你必须检查文档。它指出'dataTask'的完成处理程序将在委托队列中执行(当你创建'URLSession'时,你通常会交给它)。由于您使用单例('URLSession.shared'),因此它将使用任意的工作线程 - 虽然这在文档中没有明确说明。 –

+0

感谢您的帮助! – jonthornham