2017-03-08 14 views
0

URLSession 및 Backendless라는 서비스로 작업하고 있습니다. Backendless는 Parse와 매우 유사합니다.URLSession에서 비동기 호출이 작동하지 않습니다.

Backendless는 이메일을 보낼 수있는 메시징 서비스를 제공합니다. 내 응용 프로그램에서 오류보고를 위해 이것을 사용하고 있습니다. Backendless 메서드를 호출하는 sendErrorCodeEmail()이라는 메서드를 만들었습니다. 이것이 어떻게 작동하는지에 대한 간단한 예가 아래와 같습니다.

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

이것은 완벽하게 작동합니다.

내 문제는 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

을, 이것은 단지'코드 ("오류가 발생했습니다")는'self.sendErrorCodeEmail에 도달 할 것 nil, 오류가없는 경우도 있지만 데이터가 적용되지 않은 경우는 없습니다. 추가 인쇄 문/중단 점을 추가하고 코드에 도달했는지 확인하십시오. 코드에 도달했는데 작동하지 않으면 무슨 일이 일어 났는지 알려주고 오류가 발생합니까? – Scriptable

+0

@Scriptable 코드를 읽기 쉽게 만들기 위해 단순화되었습니다. 위의 문제는 프로덕션 코드에서 다룹니다. 그래도 좋은 점. 나는 그 의견을 고맙게 생각한다. 나는 오해의 소지가있는 것을 의도하지 않았습니다. – jonthornham

+0

아무런 걱정도없고, 상황을 완전히 이해하려고 시도하면 제대로 작동해야합니다. – Scriptable

답변

1

작업자 스레드에서 send을 호출하는 데 문제가 있다고 가정합니다. 당신은 시도 할 수

주 스레드에서 호출 호출 할 : 오류가없는 경우 코드를 보면

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

Brilliant. 감사. 새로운 송신자가 작업자 스레드에 있었던 이유가 있습니까? 이것이 기본 동작입니까? main 이외의 스레드에 비동기 호출을 넣으려면? – jonthornham

+0

설명서를 확인해야합니다. 'dataTask'의 완료 핸들러는 델리게이트 큐에서 실행될 것입니다 (여러분은 보통'URLSession'을 생성 할 때 그것을 넘겨줍니다). 싱글 톤 ('URLSession.shared')을 사용하기 때문에 이것은 임의의 작업자 스레드를 사용합니다 - 이것은 문서에 명확하게 언급되어 있지는 않지만. –

+0

도움을 주셔서 감사합니다! – jonthornham