Cómo salir del bucle en una llamada asincrónica?

Versión simplificada de mi código es este:

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;
    }
}

Necesito salir de este bucle debido a que todavía es la comprobación de otras habitaciones después de unirse a uno. Quiero dejar de comprobar resto de las habitaciones cuando se unió convierte en verdadera. Pero por supuesto que se cumple en la llamada asincrónica sólo por lo que mi método no funciona.

¿Cómo puedo salir de este bucle cuando se unió convierte en realidad?

  • Respuesta seleccionada
    Maverick
    4 de mayo de 2019

    async llamada a la función debe ser evitado en el interior del bucle. Supongamos que checkRoom() método que hace la llamada a la API internamente. En ese caso, el bucle se ejecutará en todas las habitaciones y las solicitudes de API para todas las habitaciones estarían en la cola, independientemente de cuando se obtenga respuesta para cada solicitud.

    Idealmente, usted debe reemplazar el bucle con la recursividad. Llamada checkRoom() dentro de una función, digamos que es mainFunction(), y espere la respuesta. Si el criterio para unirse a la habitación no cumple, a continuación, llame a su mainFunction() de forma recursiva que va a hacer la siguiente llamada a checkRoom() function. Algo como esto:

    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()
                }
            }
    }
    

    Otra forma sería a la cola de todas sus solicitudes a checkRoom() function y tan pronto como su sala de unirse a criterio de cumple, detener las tareas que no son ejecutados en la cola.