0

NSURLSession を使用してデータが受信されているときの検出に問題があります。NSURLConnection を使用した同等のコードは機能しますが、ここには含まれていません。

この例では、google.com にリクエストを送信しています。completionHandler が機能し、「完了」が出力されます (コードを変更した場合はデータなども)。

ただし、 didReceiveData はトリガーされず、「受信データ」は出力されません。

私はドキュメントを調べて大量の検索を行ってきましたが、これは正しいように見えますが、動作させることができないようです. これについての助けをいただければ幸いです。

(ストリーミング json API を解析するので、didReceiveData を使用する必要があります。)

ありがとう!

import UIKit

class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate {

  override func viewDidAppear(animated: Bool) {
    let session = NSURLSession.sharedSession()

    var task = session.dataTaskWithURL(NSURL(string: "https://google.com")!, completionHandler: { (data, response, error) -> Void in
      print("complete")
    })

    task.resume()
  }

  func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
    print("received data")
  }
}
4

2 に答える 2

1

2 つの問題がありました。

セッションが作成されたら、デリゲートを定義する必要があります。これが didReceiveData が呼び出されなかった主な理由です。

2 つ目の問題は、completedHandler ブロックを使用すると、すべてのデリゲート関数がバイパスされることです。NSURlSession のコードでは、

extension NSURLSession {
    /*
     * data task convenience methods.  These methods create tasks that
     * bypass the normal delegate calls for response and data delivery,
     * and provide a simple cancelable asynchronous interface to receiving
     * data.  Errors will be returned in the NSURLErrorDomain, 
     * see <Foundation/NSURLError.h>.  The delegate, if any, will still be
     * called for authentication challenges.
     */

完了、エラーなどをチェックする必要がある各デリゲート関数を実装する必要があります。

更新されたコードは次のとおりです。

import UIKit

class ViewController: UIViewController, NSURLSessionDelegate {

  override func viewDidAppear(animated: Bool) {
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

    var task = session.dataTaskWithURL(NSURL(string: "https://google.com")!)
    task.resume()
  }

  func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
    print("received data")
  }
}
于 2016-01-08T04:28:12.133 に答える