gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:50:46 25 4
gpt4 key购买 nike

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

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

我需要退出这个循环,因为它在加入一个房间后仍在检查其他房间。当加入成为现实时,我想停止检查其余房间。但当然它只在异步调用中变为 true,所以我的方法不起作用。

如何在 joined 变为 true 时退出此循环?

最佳答案

应避免在循环内调用异步函数。假设 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 请求)添加到一个队列中,一旦您的房间加入标准满足,就停止仍未决的任务/请求在队列中。

关于ios - 如何在异步调用中退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com