Swift iOS:如何强制使用异步代码的循环同步 运行?

Swift iOS: How to force a loop with async code to run synchronously?

所以我有以下代码:

func handleSendPost() {
    let postRef = Global.FIRDB!.child("posts").childByAutoId()

    for p in postComponents {
        var values: [String : Any] = ["type": p.type!.rawValue, "text": p.text]

        let childRef = reference.childByAutoId()
        childRef.updateChildValues(values, withCompletionBlock: {
            (err, ref) in

            if err != nil {
                print(err)
                return
            }

            // object successfully saved
        })
    }
}

它基本上是一个 iOS 博客应用程序。当有人创建 post 时,它会被分解成可能是文本或图像的组件。他们完成编辑后,将通过调用 updateChildValues 异步函数将其存储在 Firebase 上。问题是我想保持 postComponents 的顺序。如果我 运行 上面的代码,顺序可能会混乱,因为它取决于 updateChildValues 运行的速度。

我已经尝试使用 DispatchSemaphore (iOS 10) 无济于事。

可能还有其他方法,但我想您可以忘记循环并改用递归。流程如下:

  1. 将元素存储在数组中。
  2. 如果数组中至少有一个元素,则调用发送第一个元素的函数。
  3. 在完成块中,删除数组的第一个元素并重复步骤 2。

这将按顺序发送所有元素,并在没有更多元素时停止。