异步回调的时间

时间:2016-09-29 14:37:32

标签: ios

我希望从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循环的原因是为了说明一些耗时/非异步过程。以下是我想知道的三个案例

  1. 假设程序在任务C的中途,在完成A和B之前是否完成C和D以及

  2. 假设程序在任务E的中途,在完成A和B之前是否完成E和F:

1 个答案:

答案 0 :(得分:0)

如果任务同时运行,它们可能会互相替换为活动的东西,并且可能只是继续真正的并发,因为自4s以来所有iOS设备都有多个核心。在中断时,任何特定的for循环都不会出现在任何特定点。

如果Firebase在串行队列上调度其完成处理程序,则所有处理程序都不会与其他任何处理程序重叠。

如果Firebase在主队列上调度其完成处理程序,并且您从主队列中调用它,则其完成处理程序和调用代码都不会相互重叠。

所以,直接回答:

  1. 是的,如果Firebase在您调用的同一队列上安排完成处理程序,并且该队列是串行的 - 这几乎总是意味着“是”'如果一切都是主队列链接。否则没有。

  2. 同样的答案。 for循环没有特殊的并发魔力。它们与任何其他代码一样完全可用。