web-dev-qa-db-fra.com

Le bloc d'achèvement NSURLSession n'est pas appelé

var session = NSURLSession.sharedSession()
session.dataTaskWithRequest(urlRequest, 
                            completionHandler: {(data: NSData!, 
                                                 response: NSURLResponse!,                       
                                                 error: NSError!) in
                                                      println(data)
                                                      println(response)
                                                      println(error)
                                               })

Je fais donc cette demande et le bloc d'achèvement n'est jamais appelé. 

Qu'est-ce qui ne va pas?

De plus, j'ai essayé un synchronous and asynchronous form de la même requête avec NSURLConnection et cela a parfaitement fonctionné.

MODIFIER:

J'ai essayé d'affecter une variable dataTask au session.dataTaskWithRequest et de l'afficher juste après. Il dit ceci <__NSCFLocalDataTask: 0xb41bda0> { suspended } Suspendu? Pourquoi?

17
esh

Alors j'ai essayé de l'appeler comme ça 

session.dataTaskWithRequest(urlRequest, 
                        completionHandler: {(data: NSData!, 
                                             response: NSURLResponse!,                       
                                             error: NSError!) in
                                                  print(data)
                                                  print(response)
                                                  print(error)
                                           }).resume()

Et ça a marché. 

On dirait que je dois appeler resume() sur une tâche de session suspendue par défaut.

49
esh

Utilisez-vous des terrains de jeux?

Si vous êtes, vous devriez faire attention à inclure:

 XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

Pour que le terrain de jeu attende le rappel

7
supersabbath

Je suis confronté au même problème et je l'ai résolu par 

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) {

    if (!error)
    {
        NSLog(@"Data is %@",data);
        NSLog(@"Response is %@",response);
        NSLog(@"Error is %@",error);
    }
 }];

[dataTask resume];

Et vérifiez que vous avez ajouté le App Transport Security Settings dans votre info.plist.

2
Ramakrishna

Vous pouvez également l'utiliser simplement en: -

let url = "api url"

let nsURL = NSURL

let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL) {
(data, response, error) in
   // your condition on success and failure
}

task.resume()
2
Rachit

Il s'agit d'un cas assez unique, mais si vous utilisez une session URLSession dans un test unitaire, vous devez configurer les attentes. Sinon, votre scénario de test se terminera et il apparaîtque votre demande n’est jamais renvoyée. Swift 3.0.1.

    let expect = expectation(description: "dataTaskWithRequest - completes")

    if let url = URL(string: "https://www.google.com/") {

        let request = URLRequest(url: url)

        URLSession.shared.dataTask(with: request) { ( data, response, error) in

            print(data.debugDescription)
            print(response.debugDescription)
            print(error.debugDescription)

            expect.fulfill()

        }.resume()

        waitForExpectations(timeout: 10, handler: nil)
    }
1
Justin Domnitz

Ça va être quelque chose comme ça dans Swift 2.x

NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
    print(response)
}.resume()
0
Jay Mayu