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

时间:2016-09-13 15:58:11

标签: 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.childByAutoId()
        childRef.updateChildValues(values, withCompletionBlock: {
            (err, ref) in

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

            // object successfully saved
        })
    }
}

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

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

1 个答案:

答案 0 :(得分:2)

可能有其他方式,但我想你可能会忘记循环并使用递归代替。流程如下:

  1. 将元素存储在数组中。
  2. 如果数组中至少有一个元素,则调用发送第一个元素的函数。
  3. 在完成块中,删除阵列的第一个元素并重复步骤2.
  4. 这将按顺序发送所有元素,并在没有更多元素时停止。