Swift 嵌套for循环中的多个异步请求

Swift 嵌套for循环中的多个异步请求,swift,firebase,asynchronous,firebase-realtime-database,Swift,Firebase,Asynchronous,Firebase Realtime Database,我试图从我的数据库中获取数据,在获取一段数据后,使用该段数据找到一段新数据 最后,我可以将这些数据拼凑在一起并返回导出的数据。我不确定这是最好的方法,但这就是我现在的处境 我的问题是,对数据库(Firebase)的每个调用都是异步的,因此我需要以某种方式等待异步完成,然后才能继续 我已经查看了调度组,以下是我到目前为止的情况: let taskGroup = DispatchGroup() for buildingKey in building.allKeys {

我试图从我的数据库中获取数据,在获取一段数据后,使用该段数据找到一段新数据

最后,我可以将这些数据拼凑在一起并返回导出的数据。我不确定这是最好的方法,但这就是我现在的处境

我的问题是,对数据库(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。对于
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。请编辑您的答案。