可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
var session = NSURLSession.sharedSession()
session.dataTaskWithRequest(urlRequest,
completionHandler: {(data: NSData!,
response: NSURLResponse!,
error: NSError!) in
println(data)
println(response)
println(error)
})
So I am making this request, and the completion block is never called.
What's wrong?
Also I tried a synchronous and asynchronous form
of the same request with NSURLConnection
and it worked perfectly.
EDIT:
I tried assigning a dataTask
variable to the session.dataTaskWithRequest
and displayed it right after. It says this <__NSCFLocalDataTask: 0xb41bda0> { suspended }
Suspended? Why?
回答1:
So I tried calling it like this
session.dataTaskWithRequest(urlRequest,
completionHandler: {(data: NSData!,
response: NSURLResponse!,
error: NSError!) in
print(data)
print(response)
print(error)
}).resume()
And it worked.
Seems like I have to call resume()
on a default suspended session task.
回答2:
Are you using playgrounds??
If you are, you should be careful to include:
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
In order to make the playground wait for the callback
回答3:
You can also use it simply by :-
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:
I face the same problem and I solved it by
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];
And check that you are added the App Transport Security Settings
in your info.plist
.
回答5:
This is a fairly unique case, but if you're using a URLSession inside a unit test, you'll need to setup the expectations. Otherwise, your test case will end and it will appear that your request is never returning. 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)
}
回答6:
It'll be something like this in Swift 2.x
NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
print(response)
}.resume()