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