Блок завершения 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()