Swift 嵌套for循环中的多个异步请求
我试图从我的数据库中获取数据,在获取一段数据后,使用该段数据找到一段新数据 最后,我可以将这些数据拼凑在一起并返回导出的数据。我不确定这是最好的方法,但这就是我现在的处境 我的问题是,对数据库(Firebase)的每个调用都是异步的,因此我需要以某种方式等待异步完成,然后才能继续 我已经查看了调度组,以下是我到目前为止的情况:Swift 嵌套for循环中的多个异步请求,swift,firebase,asynchronous,firebase-realtime-database,Swift,Firebase,Asynchronous,Firebase Realtime Database,我试图从我的数据库中获取数据,在获取一段数据后,使用该段数据找到一段新数据 最后,我可以将这些数据拼凑在一起并返回导出的数据。我不确定这是最好的方法,但这就是我现在的处境 我的问题是,对数据库(Firebase)的每个调用都是异步的,因此我需要以某种方式等待异步完成,然后才能继续 我已经查看了调度组,以下是我到目前为止的情况: let taskGroup = DispatchGroup() for buildingKey in building.allKeys {
let taskGroup = DispatchGroup()
for buildingKey in building.allKeys
{
var aprt = NSDictionary()
taskGroup.enter()
// ASYNC REQUEST
getAbodesWithUID(UID: buildingKey as! String, callback: { (success, abodes) in
aprt = abodes
taskGroup.leave()
})
taskGroup.enter()
for key in aprt.allKeys
{
// ASYNC REQUEST
getTenantsWithAprt(UID: key as! String, callback: { (success, user) in
for userKey in user.allKeys
{
let dict = NSMutableDictionary()
dict.setValue(((building[buildingKey] as? NSDictionary)?["Address"] as? NSDictionary)?.allKeys[0] as? String, forKey: "Building")
dict.setValue((user[userKey] as? NSDictionary)?["Aprt"], forKey: "Number")
dict.setValue((user[userKey] as? NSDictionary)?["Name"], forKey: "Name")
dict.setValue(userKey, forKey: "UID")
dict.setValue((user[userKey] as? NSDictionary)?["PhoneNumber"], forKey: "Phone")
apartments.append(dict)
}
taskGroup.leave()
})
}
}
taskGroup.notify(queue: DispatchQueue.main, execute: {
print("DONE")
callback(true, apartments)
})
我似乎无法让它正确地回调首先,您应该迭代
aprt。对于getAbodesWithUID
,回调内部的所有键
,否则,当for循环执行aprt
时,将是一个空字典
其次,for循环上方的taskGroup.enter()
调用应该在for循环内部,因为每个键都需要调用一次。它应该放在异步请求注释当前所在的位置。这正是“承诺”的目的。它们可通过第三方加载项以Swift形式提供。一种流行的方法是将所有的读取/获取推送到一个数组中。然后你承诺.all(yourArray),它返回结果/值的数组,然后你迭代得到每个结果/值
发件人:
你可以调查什么时候可以提供你需要的东西,什么时候可以被覆盖
使用循环将您的承诺放入数组中,然后执行某些操作
像这样:
when(fulfilled: promiseArray).then { results in
// Do something
}.catch { error in
// Handle error
}
我会使用完成处理程序来完成这个任务。@Jake,你能再解释一下吗?回调不是一个完成处理程序吗?是的。如果您试图获取一个值,然后使用刚刚获得的值找到一个新结果,我将尝试编写一个带有完成处理程序的函数,并将您的函数嵌套在它自己的完成处理程序中,以便一次只获取一层数据。函数(completion{if true{function(completion等))}@Jake,但它都在for循环中。那么,我将把主要函数放在哪里呢?如果在嵌套部分的外部,则嵌套部分是异步的,因此在完成之前将调用主完成处理程序,如果在内部,则将调用一次,第一次timeSwift没有承诺。您必须为他们使用Swift第三方SDK。请编辑您的答案。