2016-01-08 1 views
0

Je rencontre un problème lors de la détection des données à l'aide de NSURLSession. Le code équivalent avec NSURLConnection fonctionne, mais ce n'est pas inclus ici.NSURLSession didReceiveData non déclenché

Dans cet exemple, je fais une demande à google.com. Le completionHandler fonctionne et "complete" est imprimé (aussi les données, etc si vous changez le code).

Cependant, didReceiveData n'est pas déclenché et les "données reçues" ne sont jamais imprimées.

J'ai été à travers les docs et fait beaucoup de recherche et je pense que cela semble juste, mais je n'arrive pas à le faire fonctionner. Certainement apprécierait toute aide avec ceci.

(j'utiliser didReceiveData parce que je vais analyser un api JSON streaming.)

Merci!

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") 
    } 
} 

Répondre

-2

Vous pouvez obtenir des données uniquement dans completionHandler. Pourquoi voulez-vous utiliser didReceiveData?

Ci-dessous le code va vous montrer comment vous pouvez obtenir les données reçues

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() 
} 
+0

Merci pour essayer, mais ce n'est pas ce dont j'ai besoin. Comme je l'ai dit dans la question, "(j'ai besoin d'utiliser didReceiveData parce que je vais analyser un streaming json api.)" – Geuis

2

Il y avait deux questions. Lorsque la session est créée, vous devez définir un délégué. C'était la principale raison pour laquelle didReceiveData n'était pas appelé.

Le second problème est que si vous utilisez un bloc completionHandler, toutes les fonctions délégués sont ignorées. Dans le code de NSURlSession, il dit

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. 
    */ 

Vous devez implémenter chaque fonction de délégué, vous devez vérifier l'achèvement, erreurs, etc.

Le code mis à jour est ci-dessous:

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") 
    } 
}