2014-06-05 15 views
16
var session = NSURLSession.sharedSession() 
session.dataTaskWithRequest(urlRequest, 
          completionHandler: {(data: NSData!, 
               response: NSURLResponse!,      
               error: NSError!) in 
                 println(data) 
                 println(response) 
                 println(error) 
               }) 

Składam więc tę prośbę, a blok ukończenia nigdy nie jest wywoływany.NSURLKoniec ukończenia sesji nie nazywa się

Co jest nie tak?

Próbowałem również synchronous and asynchronous form tego samego żądania z NSURLConnection i działało idealnie.

EDIT:

Próbowałem przypisanie zmiennej dataTask do session.dataTaskWithRequest i wyświetlane go tuż po. Mówi ta <__NSCFLocalDataTask: 0xb41bda0> { suspended } Zawieszona? Czemu?

Odpowiedz

49

Spróbowałem więc nazywając go jak ten

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

I to działało.

Wygląda na to, że muszę wywołać resume() w domyślnym zadaniu sesji zawieszonej.

+9

Tak. To samo dotyczy Swift lub Cel C; wszystkie zadania NSURLSession rozpoczynają się w stanie zawieszenia i muszą zostać "wznowione", aby je wyrzucić. Jest oparty na C, ale [ten tutorial NSURLSession od raywenderlich.com] (http://www.raywenderlich.com/51127/nsurlsession-tutorial) jest najlepszym nie-jabłkowym przykładem kodu NSURLSession, z którym się zetknąłem, więc przejrzenie tego może pomóc w ustaleniu, jak najlepiej z niego korzystać. –

+0

resume() jesteś gwiazdą - dziękuję –

+0

mi nie pomogło :( –

2

Można również użyć go po prostu: -

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

Ten działa dla ja –

7

Używasz zabaw ??

Jeśli są, należy uważać, aby to:

XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true) 

Aby czekać Plac zwrotnego

+1

Musisz też "zaimportować XCPlayground". –

0

To będzie coś takiego w Swift 2.x

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

Jest to dość unikalny przypadek, ale jeśli używasz URLSession w teście jednostki, musisz skonfigurować oczekiwania. W przeciwnym razie Twój przypadek testowy się zakończy i pojawi się , że twoja prośba nigdy nie wróci. 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

I twarz ten sam problem i rozwiązać go przez

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]; 

i sprawdź, czy są dodawane do App Transport Security Settings w info.plist.