我希望从intenet下载请求中更好地了解完成块的时间。在这种情况下firebase。下面的代码示例没有做任何事情,但它说明了我的问题。
假设我在keysArray中有100个值,那么将有100个对firebase的异步请求,并且完成块将被执行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:
答案 0 :(得分:0)
如果任务同时运行,它们可能会互相替换为活动的东西,并且可能只是继续真正的并发,因为自4s以来所有iOS设备都有多个核心。在中断时,任何特定的for
循环都不会出现在任何特定点。
如果Firebase在串行队列上调度其完成处理程序,则所有处理程序都不会与其他任何处理程序重叠。
如果Firebase在主队列上调度其完成处理程序,并且您从主队列中调用它,则其完成处理程序和调用代码都不会相互重叠。
所以,直接回答:
是的,如果Firebase在您调用的同一队列上安排完成处理程序,并且该队列是串行的 - 这几乎总是意味着“是”'如果一切都是主队列链接。否则没有。
同样的答案。 for
循环没有特殊的并发魔力。它们与任何其他代码一样完全可用。