Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSURLSession未收到未触发的数据_Swift_Nsurlsession_Nsurlsessiondatatask - Fatal编程技术网

Swift NSURLSession未收到未触发的数据

Swift NSURLSession未收到未触发的数据,swift,nsurlsession,nsurlsessiondatatask,Swift,Nsurlsession,Nsurlsessiondatatask,我在使用NSURLSession检测何时接收数据时遇到问题。NSURLConnection的等效代码确实有效,但这里不包括这一点 在这个例子中,我向google.com发出了一个请求。completionHandler工作并打印“complete”(如果更改代码,还打印数据等) 但是,不会触发didReceiveData,也不会打印“接收的数据” 我已经浏览了文档,做了大量的搜索,我认为这看起来是对的,但我似乎无法让它发挥作用。如果您能在这方面给予帮助,我将不胜感激 (我需要使用didRecei

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

在这个例子中,我向google.com发出了一个请求。completionHandler工作并打印“complete”(如果更改代码,还打印数据等)

但是,不会触发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")
  }
}

您只能在
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()
 }

有两个问题

创建会话时,必须定义委托。这是没有调用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.
     */

谢谢你的尝试,但这不是我需要的。正如我在问题中所说,“(我需要使用didReceiveData,因为我要解析一个流json api。)”
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")
  }
}