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?
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.
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
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
.
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()
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)
}
Ça va être quelque chose comme ça dans Swift 2.x
NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
print(response)
}.resume()