如何在异步调用中退出循环?

时间:2018-10-28 06:27:14

标签: ios swift xcode for-loop asynchronous

我的代码的简化版本是这样的:

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 :(得分:1)

异步函数调用应避免在循环内进行。假设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请求)添加到队列中,并在满足会议室加入条件后立即停止仍在队列中的任务/请求。< / p>