Почему мы должны вызывать основной поток для обновления пользовательского интерфейса?
Я знаю, что мы должны вызывать основной поток, когда мы обновляем интерфейс. Но я не могу объяснить своим товарищам по команде, почему мы должны это делать и почему Swift не делает этого автоматически.
Раньше они вызывали self.present() так:
self.present(alert, animated: true)
Но я знаю, что вы должны называть это так:
DispatchQueue.main.async {
self.present(alert, animated: true)
}
Я действительно хотел бы убедиться, что метод всегда вызывается в основном потоке, но я не знаю, как... Другой вопрос: почему я должен убедиться, что этот метод вызывается в основном потоке, а не в Swift? Когда кто-то вызывает этот метод, всегда есть обновление пользовательского интерфейса.
@available(iOS 5.0, *)
open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
1 ответ
В каждой структуре пользовательского интерфейса есть (почти?) Отдельный поток пользовательского интерфейса, и все операции пользовательского интерфейса должны выполняться в этом. Я думаю, что основной причиной такого дизайна является предотвращение неожиданного поведения пользовательского интерфейса. Подумайте о следующей ситуации:
- В таблице есть список записей, назовите их "A" и "B"
- "А" в настоящее время выбрано
- Пользователь хочет удалить "B"
- Пользователь выбирает "B"
- Пользователь нажимает кнопку "Удалить выбранную запись"
Если у пользователя быстрый щелчок / нажатие и пользовательский интерфейс были многопоточными, то может случиться так, что обработчик события "select B" будет создан после обработчика "delete selected entry". Следовательно, "A" все еще выбрано и будет удалено.
Следовательно, типичные платформы отслеживают события в очереди и обрабатывают эту очередь в строгом порядке. Это то, что вы бы назвали "однопоточным".
Поэтому, если вы отправляете что-то в основной поток, вы должны знать, что время выполнения не определено, поэтому вы не должны полагаться на какое-либо состояние пользовательского интерфейса во время постановки в очередь.