Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 取消正在DispatchQueue中等待执行的DispatchWorkItem_Ios_Swift_Swift3_Grand Central Dispatch_Swift4 - Fatal编程技术网

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
,非常感谢您的帮助:)

一个简单的方法是将2
UITapGestureRecognitor
添加到视图中(
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看看这个答案:。它将帮助您限制可点击区域。