Как выйти из цикла при асинхронном вызове? - PullRequest
0 голосов
/ 28 октября 2018

Упрощенная версия моего кода выглядит следующим образом:

var joined = false

for room in rooms {
    checkRoom() { // async func
        if room.player.count == 1 { 
            join(room)
            joined = true
            // break doesnt work here
        }
    }

    if joined {
        break;
    }
}

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

Как выйти из этого цикла, когда объединенный становится истинным?

1 Ответ

0 голосов
/ 28 октября 2018

Асинхронный вызов функции следует избегать внутри цикла.Предположим, что метод 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) в очередь, и как только критерий присоединения вашей комнаты встретится, остановите задачи / запросы, которыевсе еще ожидают в очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...