取消DispatchWorkItem等待在DispatchQueue中执行

时间:2017-07-25 19:34:49

标签: ios swift swift3 grand-central-dispatch swift4

我想要实现的目标:

我正在尝试执行两项不同的任务,具体取决于用户是否在touchesBegan方法中点击了屏幕一次或两次。

在执行此操作的过程中,我将singleTapTask的执行时间推迟0.3秒,以便取消属于DispatchWorkItem的{​​{1}}。

我的方法:

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首先执行,并非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

一种简单的方法是在视图中添加2 UITapGestureRecognizersingleTapGestureRecognizerdoubleTapGestureRecognizer)。

第一个配置了singleTapGestureRecognizer.numberOfTapsRequired = 1,第二个配置了doubleTapGestureRecognizer.numberOfTapsRequired = 2

现在添加singleTapGestureRecognizer.require(toFail: singleTapGestureRecognizer)

此外,根据您的上述方法,您不是针对顺序单击和双击,而是一次点击时的点击数(同时点击手指的数量)