私は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()
}
ご協力いただければ幸いです。
エラーがない場合には、これが唯一の 'self.sendErrorCodeEmail(「エラーが発生しました」)'コードに到達しますnilで、エラーがnilではないが、データはあなたがカバーしていないnilである場合があります。追加の印刷ステートメント/ブレークポイントを追加し、コードに到達していることを確認してください。そのコードに達していて動作していない場合、何が起きているのかを教えてください。エラーが出ますか? – Scriptable
@Scriptableコードを簡略化して読みやすくしました。上記の問題は、生産コードでカバーされています。しかし、良い点。私は入力を感謝します。私は誤解を招くことはありませんでした。 – jonthornham
心配することなく、状況を完全に理解しようとすると、うまくいくように見えます。 – Scriptable