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 }
一時停止ですか?どうして?
だから私はそれをこのように呼んでみました
_session.dataTaskWithRequest(urlRequest,
completionHandler: {(data: NSData!,
response: NSURLResponse!,
error: NSError!) in
print(data)
print(response)
print(error)
}).resume()
_
そしてそれはうまくいった。
デフォルトの一時停止セッションタスクでresume()
を呼び出さなければならないようです。
遊び場を利用していますか?
含まれている場合は、以下を含めるように注意する必要があります。
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
遊び場にコールバックを待たせるために
私は同じ問題に直面し、私はそれを解決しました
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
が追加されていることを確認してください。
簡単に使用することもできます:-
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()
これはかなりユニークなケースですが、単体テスト内で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)
}
Swift 2.xでは次のようになります
NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
print(response)
}.resume()