遍历数组,使用网络调用/回调函数检查每个元素,如果未找到所需的元素,则转到默认值



由于这个问题非常具体,我在任何地方都找不到答案。 基本上,我想创建与特定用户的消息对话,但前提是与该用户的对话尚不存在。 我正在循环浏览一系列对话,对于每个对话,我都会通过调用后端来获取其他用户的身份。 但是,如果未找到与特定用户的对话,则我想创建一个新对话。 这就是我正在做的:

for convo in convos {
HTTPManager.getOtherUserFromConversation(conversation: convo, success: { (otherUser) in
if desiredUser == otherUser {
//Found the desired conversation, so bring the user 
//to it instead of creating a new one
}
}, failure: {
//Networking failure
})     
}
//IF WE DIDN'T FIND IT, CREATE A NEW CONVERSATION HERE

我想过制作一个名为"found"的布尔值,并将其设置为true,如果我们找到所需的对话,但我不知道如何等到最后一个回调执行后再检查这个布尔值,以避免过早调用检查。谁能指出我正确的方向?

对此的经典解决方案是使用调度组 https://developer.apple.com/documentation/dispatch/dispatchgroup

对此有许多代码示例。这个想法是每个网络调用都应该在一个单独的任务中,系统会让你知道所有任务何时完成(这是你检查"找到"的地方(。

如何创建回调函数,该函数将在检查 convos 的所有请求完成或找到正确的 convo 时调用。

func checkConvoIfExist(convos: [Convo]){
var found = false
var countCheck = 0
for convo in convos {
HTTPManager.getOtherUserFromConversation(conversation: convo, success: { (otherUser) in
countCheck += 1
if desiredUser == otherUser {
//Found the desired conversation
found = true
callbackCheckConvo(result: found, convo: convo)
break // to stop the loop
}else{
if (countCheck == convos.count){
callbackCheckConvo(result: found)
}
}
}, failure: {
//Networking failure
countCheck += 1
if (countCheck == convos.count){
callbackCheckConvo(result: found)
}
})     
} 
}
func callbackCheckConvo(result: Bool, convo: Convo = nil){
if (result){
//found the desired conversation, so bring the user to it instead of creating a new one
}else{
//convo not found, create new one
}
}

相关内容

最新更新