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
,但效果非常好。
编辑:
我尝试将dataTask
变量分配给session.dataTaskWithRequest
并在之后显示。它说这<__NSCFLocalDataTask: 0xb41bda0> { suspended }
暂停了吗?为什么呢?
答案 0 :(得分:51)
所以我试着像这样调用它
session.dataTaskWithRequest(urlRequest,
completionHandler: {(data: NSData!,
response: NSURLResponse!,
error: NSError!) in
print(data)
print(response)
print(error)
}).resume()
它有效。
似乎我必须在默认的暂停会话任务上调用resume()
。
答案 1 :(得分:7)
你在使用游乐场吗?
如果你是,你应该小心包括:
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
为了让游乐场等待回调
答案 2 :(得分:2)
您也可以通过以下方式使用它: -
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()
答案 3 :(得分:2)
我面临同样的问题,我通过
解决了这个问题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
。
答案 4 :(得分:1)
这是一个相当独特的案例,但如果您在单元测试中使用URLSession,则需要设置期望值。否则,您的测试用例将结束,将显示您的请求永远不会返回。 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 :(得分:0)
在Swift 2.x中它会是这样的。
NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
print(response)
}.resume()