#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
функцию из основного потока.