Отмена DispatchWorkItem, ожидающего выполнения в DispatchQueue

Чего я пытаюсь достичь:

Я пытаюсь выполнить две разные задачи в зависимости от того, коснулся ли пользователь экрана один или два раза в методе touchesBegan.

В процессе этого я задерживаю выполнение singleTapTask на 0,3 с, чтобы иметь возможность отменить DispatchWorkItem, принадлежащий doubleTapTask.


Мой подход:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {

        let singleTapTask = DispatchWorkItem {
            // single tap
        }
        let doubleTapTask = DispatchWorkItem {
            // double tap
        }

        if touch.tapCount == 1 {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: singleTapTask)

        } else if touch.tapCount == 2 {
            singleTapTask.cancel()
            DispatchQueue.main.async(execute: doubleTapTask)

        }
    }
}

Проблема:

По какой-то причине singleTapTask все еще выполняется вместе с doubleTapTask, хотя singleTapTask было отменено. Я не могу понять, почему singleTapTask выполняется в первую очередь, и был бы очень признателен за вашу помощь :)


person Devapploper    schedule 25.07.2017    source источник
comment
Почему вы не используете для этого UIGestureTapRecognizer?   -  person Nikita Gaidukov    schedule 25.07.2017
comment
Я думал о том, чтобы распознавать одинарное/двойное касание можно было только на определенной части экрана, но в конечном итоге я мог бы так и сделать @NikitaGaydukov   -  person Devapploper    schedule 25.07.2017
comment
взгляните на этот ответ: stackoverflow.com /вопросы/9346315/. Это поможет вам ограничить доступную область.   -  person Nikita Gaidukov    schedule 26.07.2017


Ответы (1)


Простым подходом для этого было бы добавить 2 UITapGestureRecognizer к вашему представлению (singleTapGestureRecognizer и doubleTapGestureRecognizer).

Первый сконфигурирован с singleTapGestureRecognizer.numberOfTapsRequired = 1, второй с doubleTapGestureRecognizer.numberOfTapsRequired = 2.

Теперь добавьте singleTapGestureRecognizer.require(toFail: singleTapGestureRecognizer)

Кроме того, в приведенном выше подходе вы ориентируетесь не на последовательные одиночные и двойные нажатия, а на количество нажатий за одно нажатие (количество одновременных нажатий пальцев)

person blacky85    schedule 25.07.2017