web-dev-qa-db-ja.com

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 formNSURLConnectionで試しましたが、完全に機能しました。

編集:

dataTask変数をsession.dataTaskWithRequestに割り当てて、直後に表示してみました。これは<__NSCFLocalDataTask: 0xb41bda0> { suspended }一時停止ですか?どうして?

17
esh

だから私はそれをこのように呼んでみました

_session.dataTaskWithRequest(urlRequest, 
                        completionHandler: {(data: NSData!, 
                                             response: NSURLResponse!,                       
                                             error: NSError!) in
                                                  print(data)
                                                  print(response)
                                                  print(error)
                                           }).resume()
_

そしてそれはうまくいった。

デフォルトの一時停止セッションタスクでresume()を呼び出さなければならないようです。

53
esh

遊び場を利用していますか?

含まれている場合は、以下を含めるように注意する必要があります。

 XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

遊び場にコールバックを待たせるために

7
supersabbath

私は同じ問題に直面し、私はそれを解決しました

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 Settingsinfo.plistが追加されていることを確認してください。

3
Ramakrishna

簡単に使用することもできます:-

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
Rachit

これはかなりユニークなケースですが、単体テスト内で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)
    }
1
Justin Domnitz

Swift 2.xでは次のようになります

NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response , error) in
    print(response)
}.resume()
0
Jay Mayu