Вы правы, все операции по смене интерфейса должны выполняться только в основном потоке.
Если нет, система не гарантирует, когда, в каком порядке, даже если пользовательский интерфейс будет обновлен с помощью вашего кода.
Теперь вы правы, если хотите как можно меньше загромождать основной поток и добавлять только код, связанный с пользовательским интерфейсом. Но если вы посмотрите ближе на линии, вы заметите следующее:
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = vc
, которые также изменяют пользовательский интерфейс, но находятся за пределами основного закрытия.
Я считаю, что если вы переместите эти 2 строки в главном потоке, ваше предупреждение исчезнет!