Асинхронный вызов функции следует избегать внутри цикла.Предположим, что метод checkRoom()
вызывает API-интерфейс внутри страны.В этом случае цикл будет выполняться для всех комнат, а запросы API для всех комнат будут поставлены в очередь независимо от того, когда вы получите ответ на каждый запрос.
В идеале вам следует заменить цикл на рекурсию.Вызовите checkRoom()
внутри функции, давайте назовем ее mainFunction()
и дождемся ответа.Если ваш критерий для присоединения к комнате не соответствует, то вызовите ваш mainFunction()
рекурсивно, что сделает следующий вызов функции checkRoom()
.Примерно так:
var rooms: Array<Room> = []
var currentRoomIndex: Int = 0
func mainFunction() {
checkRoom() { // async func
let room = rooms[currentRoomIndex]
if room.player.count == 1 {
join(room)
joined = true
break
} else {
currentRoomIndex += 1
mainFunction()
}
}
}
Другим способом было бы добавить все ваши вызовы к функции checkRoom()
(возможно, запросы API) в очередь, и как только критерий присоединения вашей комнаты встретится, остановите задачи / запросы, которыевсе еще ожидают в очереди.