Ответ
Распознавание и обработка жестов (UIGestureRecognizer) происходят на главном потоке (Main Thread). Это логично, так как жесты являются частью пользовательского интерфейса, а весь UI-фреймворк UIKit работает исключительно на главном потоке.
Пример добавления обработчика жеста:
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
view.addGestureRecognizer(tapRecognizer)
@objc func handleTap(_ sender: UITapGestureRecognizer) {
// Этот метод вызывается на главном потоке
print("Tap detected at: (sender.location(in: sender.view))")
}
Почему это важно:
- Согласованность: Поскольку все обновления UI (анимации, изменение свойств view) должны идти через главный поток, обработка жестов на нем же предотвращает состояние гонки (race condition).
-
Отзывчивость: Главный поток (он же UI-поток) отвечает за плавность интерфейса. Длительные операции в обработчике жеста (
handleTap) "заморозят" интерфейс. Такие задачи нужно выносить в фоновые потоки.@objc func handleTap(_ sender: UITapGestureRecognizer) { // 1. Быстрое обновление UI (на главном потоке) self.showActivityIndicator() // 2. Запуск тяжелой задачи в фоне DispatchQueue.global().async { let data = self.loadHeavyData() // 3. Возврат результата на главный поток DispatchQueue.main.async { self.hideActivityIndicator() self.presentData(data) } } }