2016-11-17 4 views
5

これは、AppleのドキュメントはNSURLSessionTaskクラスNSURLSessionTask。中断している間、

タスクのsuspend方法について言うことです動作しませんサスペンド、何のネットワークトラフィックを生成しないとタイムアウトの対象ではありません。

だから私は、次の簡単なコードを実行しています:

 let url = NSURL(string: "http://httpbin.org/delay/10")! 
     let urlRequest = NSURLRequest(URL: url) 

     self.task = NSURLSession.sharedSession().dataTaskWithURL(urlRequest.URL!, completionHandler: { 

      data, response, error in print("completion ERROR \(error)") 
     }) 

     self.task.resume() 

     print("Start") 
     delay(5, closure: { 

      self.task.suspend() 

      print("Suspend") 
     }) 

機能delaydispatch_afterのラッパーとhttp://httpbin.org/delay/10への要求は10秒後に応答を与えるだけです。応答待ちの途中で私は仕事を中断します。しかし、それは動作しません。 60秒で完了ブロックがタイムアウトエラーで呼び出されます。誰が何が間違っているのか説明できますか?

+0

あなたは 'dispatch_after'のラッパーを表示することができない

 let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in print("response is received all the time") } } dataTask.resume() dataTask.suspend() 

URLSessionDataTask

には影響しませんか? –

答えて

5

これは正常な動作であると思われますが、Appleのより詳細なドキュメントは、私たちが見ているものを明確にするのに役立ちます。

Appleのマニュアルでは、サスペンドの仕組みや使用方法の詳細については説明していません。しかし、私の見解(テストと研究に基づいて)suspend()は、ダウンロードのためにのみ使用する必要があります タスクです。データタスクはresume()(タスクを開始する)とcancel()(必要な場合)のみ使用する必要があります。

私のテストでは、XcodeとCharles Proxyを使用して、中断されたデータタスクはAppleのドキュメントに示されているようにネットワークトラフィックに影響を与えないことが明らかになりました。つまり、ネットワークトラフィックが生成されます。

は私が一時停止し、データタスクを使用して二つのことを観察:

1)それが適切再開した後と呼ばれていた場合は、データのタスクには影響しません。ネットワークトラフィックを一時停止せず、ネットワーク側やサーバー側の問題もないため、コールバックで正常な応答が受信されます。

2)dispatch.asyncAfterコールバックで呼び出された場合でも、ネットワークトラフィックは中断されませんが、コールバックは正常な応答ではなく「要求のタイムアウト」エラーが発生します。チャールズプロキシによると、リクエストは成功です。この結果、suspend()はデータタスクで使用しないでください。このコールバックの結果は、私の意見では本質的に役に立たない。予想通り

cancel()作品:データのタスクをキャンセル

。クライアント(あなた)は、サーバーから完全な応答を得る前に接続を閉じます。これは、resume()に電話をした直後に行うこともできますし、後で(要求が完了する前に)行うこともできます。

+0

"リクエストがタイムアウトしました。"それは何ですか?エラーは完了ブロックに渡されましたか?だから私にとってはあなたのために働くので、中断された仕事のための正常な挙動ですよね?はいの場合、なぜサスペンドが必要なのでしょうか?それとも私は何かを誤解しましたか? –

+0

@AndreyChernukha申し訳ありませんが、私はあなたの質問を誤解しているようです。私はあなたがコンソールで "サスペンド"メッセージを見ていないと思った。 –

+0

@AndreyChernukhaそうです、私は詳細を提供するために私の答えを更新しました。データタスクの通常の動作であるように見えます。ダウンロードタスクは、タスクが再開されて完了するまで、完了ブロックに渡されない可能性があります。 –

0

私はそれが(一時停止受け入れは)私がキャンセルしようとすると、しかし、それは

let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is cancelled") 
        } 
       } 
       dataTask.resume() 
       dataTask.cancel() 
関連する問題