Синхронизация асинхронного обратного вызова

Я хочу иметь лучшее представление о сроках завершения блока из запроса загрузки intenet. В этом случае огневая база. Следующий пример кода ничего не делает, но он иллюстрирует мои вопросы.

Скажем, у меня есть 100 значений в keysArray, будет 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, завершает ли она C, а также D, прежде чем войти в блок завершения, чтобы сделать A и B

  2. Скажем, если программа находится на полпути к задаче E, завершает ли она Е, а также F перед переходом в блок завершения для выполнения A и B

Метки

1 ответ

  1. Если задачи выполняются одновременно, они могут заменять друг друга в качестве активной вещи при возможности и могут просто продолжать с подлинным параллелизмом, учитывая, что все устройства iOS, начиная с 4s, имеют несколько ядер. Нет никакой причины, по которой какой-то конкретный forцикл будет в какой-то конкретный момент в момент прерывания.

    Если Firebase планирует свои обработчики завершения на последовательной очереди, то ни один из обработчиков не будет перекрываться с любым другим.

    Если Firebase планирует обработчики завершения в главной очереди, и вы вызываете ее из главной очереди, ни обработчики завершения, ни ваш вызывающий код не будут перекрываться друг с другом.

    Итак, непосредственно ответить:

    1. да, если Firebase планирует обработчики завершения в той же очереди, из которой вы звонили, и эта очередь является последовательной, что почти всегда означает «да», если все связано с основной очередью. Иначе нет.

    2. тот же ответ. В циклах нет особой магии forпараллелизма. Они в точности так же применимы, как и любой другой код.