异步回调的时机
我想从intenet下载请求中了解完成块的时间。在这种情况下firebase。下面的代码示例没有做任何事情,但它说明了我的问题。异步回调的时机
说我有在keysArray 100个值,将有100异步请求火力点和结束块将被执行100次
func someFunction() {
for keys in keysArray {
loadDataFromFirebaseWithKey(completionHandler: { (success, data) in
print(data)
// Task A Some length for loop
for i in 0...10000 {
print("A")
}
// Task B
for i in 10001...20000 {
print("B")
}
})
// Task C
for i in 20001...30000 {
print("C")
}
// Task D
for i in 30001...40000 {
print("D")
}
}
// Task E
for i in 40001...50000 {
print("E")
}
// Task F
for i in 50001...60000 {
print("F")
}
}
我使用这么大的for循环是说明一些原因耗时/不同步的过程。这里有三种情况,我想知道
说,如果程序是通过任务C的一半,它才去完成块做A和B
说完成C和也d如果程序通过任务E是半路上,它才去完成块做A和B完成E和还˚F
如果任务同时运行,它们可以相互替换为活动的事在一个机会,并可能只是继续真正concurrenc考虑到4s以来的所有iOS设备都有多个内核。没有任何理由,任何特定的for
循环将在中断时的任何特定点处。
如果Firebase在串行队列上安排其完成处理程序,则没有任何处理程序会与其他任何处理程序重叠。
如果Firebase在主队列上安排其完成处理程序,并且您正在从主队列中调用它,那么它的完成处理程序和您的调用代码都不会相互重叠。
所以,直接回答:
是,如果火力地堡是在同一个队列调度完成处理,你从调用和队列串行 - 这几乎总是意味着“是”,如果一切是主队列链接。否则不。
同样的答案。
for
循环没有特殊的并发性。它们与其他任何代码完全相同。
谢谢汤米。你和Rob在并发方面的很好的解释 – user125972
你有这些结果是正确的,我的意思是你打印的一切。所以,理想情况下你应该看到结果。 –
而不是发布这个问题,为什么不实际做测试?你会得到什么结果?根据结果,如果您不了解这些结果,请更新您的问题,询问结果为何出现的结果与预期不同。 – rmaddy
我很欣赏“你尝试过吗?”背后的理由吗?建议,但会提醒我们,当我们谈论并发时,经验证据应该是决定性的。合同保证很重要,而不是你是否在开发过程中遇到了千分之一的竞争条件。 – Tommy