Это ожидается.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.0 , execute: {
self.updateUI()
})
По сути то же самое, что и
DispatchQueue.main.async {
self.updateUI()
}
, что также не будет выполнено немедленно из-за того, что вы отправляете код в основной поток асинхронно .Из-за асинхронной отправки код внутри замыкания не будет выполнен немедленно, только на следующем цикле выполнения main, что может привести к измеримой задержке.