NSURLSessionTask. Приостановка не работает

вот что говорится в документации Apple относительно suspend метод NSURLSessionTask класс

задача, в то время как приостановлено, не производит сетевой трафик и не подлежит тайм-ауты.

ОК. Поэтому я запускаю следующий простой код:

        let url   = NSURL(string: "http://httpbin.org/delay/10")!
        let urlRequest = NSURLRequest(URL: url)

        self.task = NSURLSession.sharedSession().dataTaskWithURL(urlRequest.URL!, completionHandler: {

            data, response, error in print("completion ERROR (error)")
        })

        self.task.resume()

        print("Start")
        delay(5, closure: {

            self.task.suspend()

            print("Suspend")
        })

функции delay - это просто обертка вокруг dispatch_after и http://httpbin.org/delay/10 дает ответ через 10 секунд. В ожидании ответа я приостанавливаю работу. Однако это делает не работать. Через 60 секунд блок завершения вызывается с ошибкой тайм-аута. Кто-нибудь может объяснить, что случилось?

2 ответов


это кажется нормальным поведением, однако более окончательная документация от Apple была бы полезна для разъяснения того, что мы видим.

документация Apple не содержит подробного объяснения того, как приостановить работу или когда ее следует использовать. Однако,мое мнение (на основе тестирования и исследований) это suspend() следует использовать только для загрузки задачи. Задачи данных должны использовать только resume() (для запуска задачи) и cancel() когда соответствующий.

мое тестирование, используя Xcode и Charles Proxy, показало, что приостановленная задача данных не влияет на сетевой трафик, как указано в документации Apple. Другими словами, создается сетевой трафик.

я заметил две вещи, используя suspend и data tasks:

1) если он вызывается сразу после возобновления, он не влияет на задачу данных. Он не приостанавливает сетевой трафик и не запрещает проблемы на стороне сети или сервера, a успешного ответа на вызов.

2) Если это называется в dispatch.asyncAfter обратный вызов, он по-прежнему не приостанавливает сетевой трафик, однако обратный вызов получает ошибку "тайм-аут запроса" вместо успешного ответа. По словам Чарльза Прокси, запрос все же успешен. Именно этот результат заставляет меня поверить, что suspend() Не следует использовать с задачами данных. Результат этого обратного вызова по существу бесполезен в my мнение.

отмена задачи данных:

cancel() работает, как ожидалось. Клиент (вы) закрывает соединение до получения ответа от сервера. Это можно сделать сразу после вызова resume() или позже (до завершения запроса, конечно).


Я принимаю, что suspend () не влияет на URLSessionDataTask

                    let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in                        
                    print("response is received all the time")
                    }
                }
                dataTask.resume()
                dataTask.suspend()

однако, когда я пытаюсь отменить его

let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in                        
                    print("response is cancelled")
                    }
                }
                dataTask.resume()
                dataTask.cancel()