0

我在检测何时使用 NSURLSession 接收数据时遇到问题。NSURLConnection 的等效代码确实有效,但这里不包括在内。

在此示例中,我正在向 google.com 发出请求。completionHandler 工作并打印“完成”(如果您更改代码,还有数据等)。

但是 didReceiveData 没有被触发,并且“接收到的数据”永远不会被打印出来。

我浏览了文档并进行了大量搜索,我认为这看起来不错,但我似乎无法让它发挥作用。绝对会感谢任何帮助。

(我需要使用 didReceiveData 因为我要解析流式 json api。)

谢谢!

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

有两个问题。

创建会话时,您必须定义一个委托。这是没有调用 didReceiveData 的主要原因。

第二个问题是,如果你使用了 completionHandler 块,那么所有的委托函数都会被绕过。在 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 回答
-3

您只能获取数据completionHandler。为什么要使用didReceiveData

下面的代码将向您展示如何获取接收到的数据

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

    var task = session.dataTaskWithURL(NSURL(string: "https://google.com")!, completionHandler: { (data, response, error) -> Void in
      if NSJSONSerialization.isValidJSONObject(data){
            if let jsonParam = try? NSJSONSerialization.dataWithJSONObject(dictData, options: []){
                print("Result Data : \(jsonParam)")
            }
       }
    })

    task.resume()
 }
于 2016-01-08T03:31:28.477 回答