Определите порядок вывода в консоль №15

Гарантирован порядок 1, затем 2; после этого 4 идёт перед 5. Строка 3 может появиться до, между или после 4 и 5.

Короткий ответ

Что ответить на собеседовании

Гарантирован порядок 1, затем 2; после этого 4 идёт перед 5. Строка 3 может появиться до, между или после 4 и 5.

Подробный разбор

Ответ с пояснениями

Условие

import UIKit

func performPrint() {
    print("1")

    DispatchQueue.main.sync {
        print("2")
    }

    DispatchQueue.main.async {
        print("3")
    }

    print("4")
    print("5")
}

let customQueue = DispatchQueue(label: "Queue", qos: .userInteractive, attributes: [], autoreleaseFrequency: .never, target: nil)

customQueue.async {
    performPrint()
}

Задача: проанализировать, в каком порядке появятся строки в консоли при выполнении данного кода.

Ответ

Гарантирован порядок 1, затем 2; после этого 4 идёт перед 5. Строка 3 может появиться до, между или после 4 и 5.

performPrint() выполняется на customQueue, поэтому main.sync может дождаться печати 2, если главный поток обслуживает очередь и не заблокирован ожиданием customQueue. Затем main.async планирует 3, а текущая очередь независимо печатает 4 и 5. Возможны последовательности 1 2 3 4 5, 1 2 4 3 5 и 1 2 4 5 3. QoS не устанавливает порядок между этими очередями. При вызове самой функции с main queue синхронное обращение к ней привело бы к deadlock.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее