Всегда ли URLSession.dataTask (with: завершениемHandler :) всегда вызывает завершениеHandler только один раз? - PullRequest
0 голосов
/ 11 февраля 2019

После того, как я создаю новую задачу данных сеанса с URLSession.dataTask(with:completionHandler:) и запускаю задачу, вызывая ее метод resume(), учитывая, что приложение не аварийно завершает работу во время выполнения запроса, безопасно ли этодля меня предположить, что completionHandler (переданный в URLSession.dataTask(with:completionHandler:) выше) всегда будет вызываться только один раз, даже если что-то странное случится с запросом сети (например, если соединение разрывается) или с приложением (например, если оно входит вна заднем плане)?

Примечание: я не вызываю явно cancel() или suspend() для задачи.Просто resume().

Я хочу знать ответ на этот вопрос, потому что (из основного потока моего приложения) я создаю и запускаю (один за другим) несколько асинхронных сетевых запросов и хочу знать, когдапоследний закончен.

В частности, я работаю над приложением, которое имеет собственный класс с именем Account.При запуске приложение (при условии, что оно находит токен доступа к учетной записи, хранящийся в UserDefaults) создает только один экземпляр этого класса и сохраняет его в глобальной переменной (во всем приложении), которая называется account, которая представляет текущее приложение.залогиненный аккаунт.

Я добавил хранимое свойство var (экземпляр) в Account, называемое pendingGetFooRequestCount (например) и установил его по умолчанию 0.Каждый раз, когда я вызываю Account.getFoo() (метод экземпляра), я добавляю 1 к pendingGetFooRequestCount (прямо перед вызовом resume()).Внутри completionHandler (передано URLSession.dataTask(with:completionHandler:) и (для безопасности) внутри замыкания, переданного DispatchQueue.main.async(), я сначала вычитаю 1 из pendingGetFooRequestCount, а затем проверяю, равно ли pendingGetFooRequestCount 0.Итак, я знаю, что последний запрос get-foo завершен, и я могу вызвать другой метод для продолжения потока.

Какова моя логика? Будет ли это работать так, как ожидалось? Должен ли я делать это по-другому? Также,мне даже нужно уменьшить pendingGetFooRequestCount в главном потоке?

1 Ответ

0 голосов
/ 11 февраля 2019

URLRequest имеет свойство timeoutInterval, его значение по умолчанию составляет 60 секунд.Если к тому времени ответа нет, завершение вызывается с ненулевой ошибкой.

...