2017-03-08 18 views
0

私はURLSessionとBackendlessというサービスを使用しています。バックエンドレスは、Parseと非常によく似ています。URLSessionで非同期呼び出しが動作しない

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で、エラーがnilではないが、データはあなたがカバーしていないnilである場合があります。追加の印刷ステートメント/ブレークポイントを追加し、コードに到達していることを確認してください。そのコードに達していて動作していない場合、何が起きているのかを教えてください。エラーが出ますか? – 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

関連する問題