我的代码的简化版本是这样的:
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;
}
}
我需要退出此循环,因为加入一个循环后它仍在检查其他房间。加入后,我想停止检查其余房间。但是,当然只有在异步调用中它才变为真,因此我的方法不起作用。
当加入成为真后,如何退出此循环?
答案 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>