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

Swift iOS:如何强制异步代码的循环同步运行?,ios,swift,asynchronous,firebase-realtime-database,semaphore,Ios,Swift,Asynchronous,Firebase Realtime Database,Semaphore,因此,我有以下代码: 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.childBy

因此,我有以下代码:

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博客应用。当有人创建一篇文章时,它会被分解成文本或图像的组成部分。编辑完成后,通过调用
updateChildValues
async函数将其存储在Firebase上。问题是我想保持
后组件的顺序。如果我运行上面的代码,顺序可能会混乱,因为这取决于
updateChildValues
的运行速度


我已经尝试过使用
DispatchSemaphore
(ios10)但没有效果。

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

  • 将元素存储在数组中
  • 如果数组中至少有一个元素,则调用发送第一个元素的函数
  • 在完成块中,移除阵列的第一个元素并重复步骤2

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

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

  • 将元素存储在数组中
  • 如果数组中至少有一个元素,则调用发送第一个元素的函数
  • 在完成块中,移除阵列的第一个元素并重复步骤2

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

    关于@rmaddy hmm,这可能会起作用。。但我更喜欢一个更干净的解决方案,而不必创建一个
    NSOperationQueue
    数组,谢谢!我稍后会试一试的@rmaddy-hmm可能有用。。但我更喜欢一个更干净的解决方案,而不必创建一个
    NSOperationQueue
    数组,谢谢!我稍后会试一试,这是一个非常基本和干净的解决方案;为什么我没想到。。。好吧,我想为了学习,让我们看看其他人是否有其他更好的建议。如果没有,我将尝试这一点并投票表决answer@yonasstephen对你有用吗?或者你找到了另一个(也许更好的)解决方案吗?wew这是一个非常基本和干净的解决方案;为什么我没想到。。。好吧,我想为了学习,让我们看看其他人是否有其他更好的建议。如果没有,我将尝试这一点并投票表决answer@yonasstephen对你有用吗?或者你找到了另一个(也许更好的)解决方案吗?