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) 无济于事。
可能还有其他方法,但我想您可以忘记循环并改用递归。流程如下:
- 将元素存储在数组中。
- 如果数组中至少有一个元素,则调用发送第一个元素的函数。
- 在完成块中,删除数组的第一个元素并重复步骤 2。
这将按顺序发送所有元素,并在没有更多元素时停止。
所以我有以下代码:
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) 无济于事。
可能还有其他方法,但我想您可以忘记循环并改用递归。流程如下:
- 将元素存储在数组中。
- 如果数组中至少有一个元素,则调用发送第一个元素的函数。
- 在完成块中,删除数组的第一个元素并重复步骤 2。
这将按顺序发送所有元素,并在没有更多元素时停止。