Блок завершения NSURLSession не вызван

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

Итак, я делаю этот запрос, и блок завершения никогда не вызывается.

Что не так?

Также я попробовал synchronous and asynchronous form того же запроса с NSURLConnection, и он отлично работал.

EDIT:

Я попытался присвоить dataTask переменную session.dataTaskWithRequest и сразу же отобразить ее. Он говорит, что это <__NSCFLocalDataTask: 0xb41bda0> { suspended } Приостановлено? Почему?

Ответы

Ответ 1

Итак, я пробовал называть его вот так

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

И это сработало.

Похоже, я должен вызвать resume() в задаче приостановленного сеанса по умолчанию.

Ответ 2

Вы используете игровые площадки?

Если вы, вы должны быть осторожны, чтобы включить:

 XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

Чтобы игровая площадка подождала обратного вызова

Ответ 3

Вы также можете использовать его просто: -

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

Ответ 4

Это довольно уникальный случай, но если вы используете URL-адрес внутри unit test, вам нужно будет настроить ожидания. В противном случае ваш тестовый пример закончится, и появится, что ваш запрос никогда не возвращается. 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)
    }

Ответ 5

Я сталкиваюсь с той же проблемой, и я решил ее

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

И проверьте, что вы добавили App Transport Security Settings в свой info.plist.

Ответ 6

В Swift 2.x будет что-то вроде этого

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