2017-03-08 4 views
0

Je travaille avec URLSession et un service appelé Backendless. Backendless est très similaire à Parse. Backendless a un service de messagerie qui vous permet d'envoyer des courriels. J'utilise ceci pour signaler des erreurs dans mon application. J'ai créé une méthode appelée sendErrorCodeEmail() qui appelle la méthode Backendless. Un exemple simple de comment cela fonctionne est montré ci-dessous.Appel asynchrone ne fonctionnant pas avec URLSession

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

Cela fonctionne parfaitement.

Mes problèmes surviennent lorsque j'utilise sendHTMLEmail avec une URLSession. Si je signale une erreur due à une mauvaise URL, j'appelle la même méthode sendErrorCodeEmail(). Le problème est que la méthode sendHTMLEmail() de Backendless ne s'exécute pas. J'ai vérifié que sendErrorCodeEmail() est appelé.

Puisque la seule différence dans le code est l'utilisation d'URLSession, je me demande s'il y a un problème de threading ou autre chose qui me manque. sendHTMLEmail est une méthode asynchrone. Il y a aussi une version synchrone et si j'appelle ça dans sendErrorCodeEmail() ça marche. Le code de base utilisant l'URLSession est ci-dessous.

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

Toute aide serait grandement appréciée.

+0

En regardant le code, cela n'atteindre le 'self.sendErrorCodeEmail (« Il y avait une erreur »)' code lorsque l'erreur est pas nul, il y a un autre cas où l'erreur n'est pas nulle mais les données sont nulles que vous n'avez pas couvertes. ajoutez des instructions d'impression/points d'arrêt supplémentaires et assurez-vous que le code est atteint. si elle atteint le code et ne fonctionne pas alors dites-nous ce qui se passe, avez-vous des erreurs? – Scriptable

+0

@Scriptable le code a été simplifié pour le rendre facile à lire. Les problèmes ci-dessus sont couverts dans le code de production. Bons points cependant. J'apprécie la contribution. Je n'avais pas l'intention d'induire en erreur. – jonthornham

+0

pas de soucis, juste essayer de comprendre pleinement la situation, on dirait que cela devrait fonctionner – Scriptable

Répondre

1

Je suppose qu'il y a un problème avec l'appel send dans le thread de travail.

Vous pouvez essayer invoquer faire l'appel dans le thread principal:

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

Brilliant. Merci. Y a-t-il une raison pour laquelle vous avez envoyé du nouveau sur le thread de travail? Est-ce l'action par défaut? Pour mettre des appels asynchrones sur un thread autre que principal? – jonthornham

+0

Vous devrez vérifier la documentation. Il indique que le gestionnaire de complétion de 'dataTask' sera exécuté dans la file d'attente des délégués (que vous remettez généralement lorsque vous créez' URLSession'). Puisque vous utilisez le singleton ('URLSession.shared'), vous utiliserez un thread de travail arbitraire - Bien que cela ne soit pas clairement indiqué dans la documentation. –

+0

Merci pour l'aide! – jonthornham