gpt4 book ai didi

Swift:for循环等待响应并根据响应返回值

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:37 25 4
gpt4 key购买 nike

我是 swift 的新手,正在练习网络。

我有一个 child ID 列表。完整的 child 信息存储在 Firebase 数据库中。数据库中的每个 child 都有一个 ID 和一个属性 isGamer: Bool。我想创建一个函数,它将返回第一个 child ,其中 isGamer==true.我考虑的逻辑是:一个 for 循环,它将在列表上运行并检查第一个 child 是否 isGamer == true 如果是,则返回 child 的 ID,否则继续搜索。我认为它会起作用,但我不知道如何处理所有这些异步的东西,我怎样才能让 for 循环等待响应等。

主要功能将管理一切:

// Mother Function
func printFirstGamer(kidsIds: [String]) {
print(returnFirstKidIsGamer(kidsIds: kidsIds ))
}

另一个函数将找到第一个 child ,其中 isGamer==true:

// This is where I'm stuck basically

func returnFirstKidIsGamer(kidsIds: [String]) -> String {
for kidID in kids {
// Wait for previous request to finish before trying again.
DataService.instance.isKidAGamer(kidID: kidID) { (isGamer) in

}
// The for loop will wait for response and then if isGamer==false, will continue, if isGamer==true will return
}
// return first kid where isGamer == true

}

我将使用这个函数来检查每个 child 的 isGamer:

func isKidAGamer(kidID: String, completed: @escaping isKidAGamerCompleted) {
mainRef.child("Kids").child(kidID).child("isGamer").observeSingleEvent(of: .value, with: { (result) in
if result.exists() {
let isGamer = result.value as! Bool
completed(isGamer)
} else {
completed(false)
}
})
}

注意:我不想用查询,我在练习(:

谢谢(:

最佳答案

可以使用 DispatchGroup 使其同步,但绝不能在主队列上调用它。

// Blocking function. Must not be called on main queue!
func returnFirstKidIsGamer(kidsIds: [String]) -> String? {
let group = DispatchGroup()
var result: String? = nil

for kidID in kidsIds {
// Wait for previous request to finish before trying again.
group.enter()
DataService.instance.isKidAGamer(kidID: kidID) { (isGamer) in
if isGamer {
result = kidId
}
group.leave()
}
group.wait()
guard result == nil else { break }
}
return result
}

这会在进入每个循环之前调用 group.enter(),并在每个步骤完成时调用 group.leave()。然后它会等待步骤完成,然后再继续。

这个函数是同步的。它会阻塞队列,因此绝不能在主队列上调用。你必须用这样的东西把它移到后台:

DispatchQueue.global(qos: .userInitiated).async {
let kidId = returnFirstKidIsGamer(kidsIds: [kids])
DispatchQueue.main.async {
doSomethingInTheUIWithValue(kidId)
}
}

请注意,这会返回 String?,而不是 String,因为可能找不到 id。

通常,您不应该这样做。您应该使用查询。但这就是在需要时将异步函数变成同步函数的方式。

关于Swift:for循环等待响应并根据响应返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48268748/

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