На каком потоке обрабатываются жесты (Gesture Recognizers) в UIKit?

«На каком потоке обрабатываются жесты (Gesture Recognizers) в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Распознавание и обработка жестов (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)
        }
    }
    }