取消在 DispatchQueue 中等待执行的 DispatchWorkItem

Posted

技术标签:

【中文标题】取消在 DispatchQueue 中等待执行的 DispatchWorkItem【英文标题】:Cancelling a DispatchWorkItem waiting for execution in DispatchQueue 【发布时间】:2017-07-25 19:34:49 【问题描述】:

我想要达到的目标:

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

在此过程中,我将singleTapTask 的执行延迟了0.3 秒,以便能够取消属于doubleTapTaskDispatchWorkItem


我的方法:

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

【问题讨论】:

你为什么不为此使用 UIGestureTapRecognizer? 我想过只希望屏幕的某个部分有资格进行单/双触摸识别,但我最终可能会这样做@NikitaGaydukov 看看这个答案:***.com/questions/9346315/…。它将帮助您限制可点击区域。 【参考方案1】:

为此,一个简单的方法是将 2 UITapGestureRecognizer 添加到您的视图中(singleTapGestureRecognizerdoubleTapGestureRecognizer)。

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

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

此外,通过上述方法,您的目标不是连续的单击和双击,而是一次轻按的轻按次数(同时轻按的手指数)

【讨论】:

以上是关于取消在 DispatchQueue 中等待执行的 DispatchWorkItem的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行

在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题

DispatchQueue 不等待异步函数完成

iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue

如何在 Swift 中测量 DispatchQueue 并发异步中的代码块执行时间?

Swift - 内部有后台线程的退出功能