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对你有用吗?或者你找到了另一个(也许更好的)解决方案吗?