Мне интересно, возможно ли выполнение замыкания, которое помещено в DispatchQueue.main
, для выполнения, пока основной поток выполняет мой код
Нет, это невозможно. Основная очередь является последовательной очередью. Если код выполняется в основной очереди, никакой «другой» код основной очереди не может быть запущен. Ваш DispatchQueue.main.async
фактически означает: «Подождите, пока весь код, выполняющийся в основной очереди, не завершится естественным образом, и , а затем запустите это в основной очереди».
С другой стороны, DispatchQueue.global()
является , а не последовательной очередью. Таким образом, теоретически возможно, чтобы два вызова calculateOutput
перекрывались. Это не то, что вы хотите, чтобы произошло; Вы хотите быть уверены, что любой выполняющийся экземпляр calculateOutput
завершает работу (и мы приступаем к работе с latestKey
), прежде чем может начаться другой. Другими словами, вы хотите убедиться, что последовательность
- установить
latestKey
в основном потоке - выполнить
calculateOutput
в фоновом режиме - посмотреть на
latestKey
на основном потоке
происходит связно. Способ обеспечить это - отложить DispatchQueue, который вы создаете с помощью DispatchQueue(label:)
, который вы всегда будете использовать для запуска calculateOutput
. По умолчанию эта очередь будет последовательной.