取消在 DispatchQueue 中等待执行的 DispatchWorkItem
Posted
技术标签:
【中文标题】取消在 DispatchQueue 中等待执行的 DispatchWorkItem【英文标题】:Cancelling a DispatchWorkItem waiting for execution in DispatchQueue 【发布时间】:2017-07-25 19:34:49 【问题描述】:我想要达到的目标:
我正在尝试执行两个不同的任务,具体取决于用户是否在 touchesBegan
方法中点击屏幕一次或两次。
在此过程中,我将singleTapTask
的执行延迟了0.3 秒,以便能够取消属于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)
问题:
由于某种原因,singleTapTask
仍与doubleTapTask
一起执行,即使singleTapTask
已被取消。
我无法弄清楚为什么首先执行singleTapTask
,非常感谢您的帮助:)
【问题讨论】:
你为什么不为此使用 UIGestureTapRecognizer? 我想过只希望屏幕的某个部分有资格进行单/双触摸识别,但我最终可能会这样做@NikitaGaydukov 看看这个答案:***.com/questions/9346315/…。它将帮助您限制可点击区域。 【参考方案1】:为此,一个简单的方法是将 2 UITapGestureRecognizer
添加到您的视图中(singleTapGestureRecognizer
和 doubleTapGestureRecognizer
)。
第一个配置singleTapGestureRecognizer.numberOfTapsRequired = 1
,第二个配置doubleTapGestureRecognizer.numberOfTapsRequired = 2
。
现在添加singleTapGestureRecognizer.require(toFail: singleTapGestureRecognizer)
此外,通过上述方法,您的目标不是连续的单击和双击,而是一次轻按的轻按次数(同时轻按的手指数)
【讨论】:
以上是关于取消在 DispatchQueue 中等待执行的 DispatchWorkItem的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行
在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题
iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue