Ios 取消正在DispatchQueue中等待执行的DispatchWorkItem
我正在努力实现的目标:Ios 取消正在DispatchQueue中等待执行的DispatchWorkItem,ios,swift,swift3,grand-central-dispatch,swift4,Ios,Swift,Swift3,Grand Central Dispatch,Swift4,我正在努力实现的目标: override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { let singleTapTask = DispatchWorkItem { // single tap } let doubleTapTask = DispatchWorkItem
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)
}
}
}
我尝试执行两个不同的任务,具体取决于用户在touchesbeated
方法中是点击屏幕一次还是两次
在执行此操作的过程中,我将singleTapTask
的执行延迟0.3s,以便能够取消属于doubleTapTask
的DispatchWorkItem
我的方法:
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)
}
}
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
接触{
让singleTapTask=DispatchWorkItem{
//单抽头
}
让doubleTapTask=DispatchWorkItem{
//双击
}
如果touch.tapCount==1{
DispatchQueue.main.asyncAfter(截止日期:.now()+0.3,执行:singleTapTask)
}否则,如果touch.tapCount==2{
singleTapTask.cancel()
DispatchQueue.main.async(执行: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
,非常感谢您的帮助:)一个简单的方法是将2UITapGestureRecognitor
添加到视图中(SingleTapGestureRecognitor
和DoubleTapGestureRecognitor
)
第一个配置了SingleTapGestureRecognitor.numberOfTapsRequired=1
,第二个配置了DoubleTapGestureRecognitor.numberOfTapsRequired=2
现在添加singleTapGestureRecognizer.require(toFail:singleTapGestureRecognizer)
此外,使用上面的方法,您的目标不是连续的单次点击和双次点击,而是一次点击的点击数(同时点击的手指数)一个简单的方法是在视图中添加2个
UITapGestureRecognizer
(SingleTapGestureRecognitor
和DoubleTapGestureRecognitor
)
第一个配置了SingleTapGestureRecognitor.numberOfTapsRequired=1
,第二个配置了DoubleTapGestureRecognitor.numberOfTapsRequired=2
现在添加singleTapGestureRecognizer.require(toFail:singleTapGestureRecognizer)
此外,使用上述方法,您的目标不是连续的单次和双次轻敲,而是一次轻敲的轻敲次数(同时轻敲的手指数)为什么不使用UIGestureTapRecognizer进行此操作?我曾想过只希望屏幕的某一部分符合单触/双触识别的条件,但我最终可能会这样做@Nikitagaydukov看看这个答案:。它将帮助您限制可点击区域。为什么不使用UIGestureTapRecognizer进行此操作?我想关于只希望屏幕的某一部分符合单/双触式识别的要求,我可能最终会这样做@Nikitagaydukov看看这个答案:。它将帮助您限制可点击区域。