Ваш код в основном выполняется так:
// 1. Send this code off to the global queue to be processed async
DispatchQueue.global(qos: .background).async {
// 3. You're here once the global queue decides it's ready to run this code
// 4. Send this code off to the main queue to be processed async
DispatchQueue.main.async {
// 6. You're here once the main queue decides it's ready to run this code
print("This is run on the main queue, after the previous code in outer block")
}
// 5. This is now printed
print("This is run on the background queue")
}
// 2. whatever happens here
Причина, по которой ваш код работает так, заключается в том, что вы отправляете все асинхронно. это означает, что все, что вам нужно сделать, это передать закрытие для выполнения целевой очередью позже или всякий раз, когда она будет готова. Используя asyn c, вы сообщаете очереди, что не хотите этого ждать.
Если вы хотите, чтобы бит основной очереди запускался немедленно, вы можете использовать DispatchQueue.main.sync
вместо этого. Это будет блокировать выполнение контекста, в котором вы находитесь (в данном случае закрытие async
, которое вы передали в глобальную очередь), пока закрытие, с которым вы работаете с sync
, не будет завершено.
Обычно я бы рекомендовал избегать sync
, если вам действительно это не нужно, потому что слишком легко заставить очередь ждать себя и быть заблокированной навсегда (тупик).