Гарантированно ли выполнение блока завершения UIViewController.present в основном потоке?

#swift #multithreading

#swift #многопоточность

Вопрос:

Кажется простым вопросом, но я не вижу никакого окончательного ответа.

В UIViewController действии:

 func present(_ viewControllerToPresent: UIViewController, 
             animated flag: Bool, 
             completion: (() -> Void)? = nil)
 

Гарантируется completion ли выполнение блока в основном потоке?

Другими словами. Могу ли я это сделать:

 vc.present(anotherVC, animated: animated) { [weak self] in

        guard let self = self else { return }

        // do some UI operations
        self.<...>
}
 

Или я должен сделать это:

 vc.present(anotherVC, animated: animated) { 

        DispatchQueue.main.async { [weak self] in

            guard let self = self else { return }

            // do some UI operations
            self.<...>
        }
}
 

Примечание: я пытался протестировать его несколько раз, и, похоже, он всегда работает в основном потоке. Но это может быть случайно, и в документе Apple не говорится ничего конкретного.

Ответ №1:

Обратный вызов завершения выполняется в основном потоке. В противном случае нет никаких причин, поскольку все манипуляции, связанные с пользовательским интерфейсом, с помощью cocoa выполняются в основном потоке. Однако вы также должны вызывать present функцию из основного потока.