Обработчики завершения ваш друг
В тот момент, когда ваш код запускается task.resume()
, он запускает ваш uploadTask
и только когда эта функция завершится, она запустит код, в котором вы измените переменную login
.
При этом сказано: этот фрагмент кода выполняется асинхронно.Это означает, что ваша строка кода return login
не будет ждать, пока ваш сетевой запрос вернется, прежде чем он запустится.
На самом деле ваш код работает в том порядке, в котором должен.Но я сам написал свой первый сетевой звонок, и у меня возникла та же проблема.Дескрипторы завершения - это то, как я это исправил
Вот очень хороший урок по Обработчикам завершения или вы можете знать это как Обратные вызовы:
Ссылка на учебное пособие по обработчикам завершений
Если я могу дать вам небольшой совет - вы получитенужно изменить свою функцию, чтобы она выглядела примерно так: func loginRequest (name: String, pwd: String, completionHandler: @escaping (Bool) -> Void)
И замените это login = true
на completionHandler(true)
Где бы вы ни вызывали свою функцию, она будет выглядеть примерно так:
loginRequest(name: String, pwd: String) {didLogIn in
print("Logged In : \(didLogIn)")
}
И последнее ... Вы на самом деле уже используете обработчики завершения в своем коде.let task = session.uploadTask(with: request, from: jsonData) { data, response, error in
...
... Но, надеюсь, теперь вы понимаете немного лучше и будете использовать подход обработчика завершения при выполнении сетевых вызовов.
УДАЧИ!