После того, как я создаю новую задачу данных сеанса с 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
в главном потоке?