我试图从我的数据库中获取数据,并在获得一条数据后,使用该条数据来查找新的数据。
最后,我可以将这些拼凑起来并返回派生数据。我不确定这是解决这个问题的最佳方法,但这是我目前所处的位置。
我的问题是对数据库 (Firebase) 的每次调用都是异步的,因此我需要以某种方式等待异步完成,然后再继续。
我已经查看了调度组,这是迄今为止我所拥有的:
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.allKeys
for 回调内部进行迭代,否则getAbodesWithUID
,当 for 循环执行时aprt
将是一个空字典。
其次,taskGroup.enter()
上面那个 for 循环的调用应该在 for 循环内部,因为它需要为每个键调用一次。它应该放在// ASYNC REQUEST
评论当前所在的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句