在 Swift 中触摸屏幕时取消的异步任务

Asynchronous task that is canceled when screen is touched in Swift

我正在开发一个在每个页面上有 5 个动画的应用程序。单击它们时会启动每个动画。帮助用户在 5 秒内如果没有按下任何图像,则释放帮助。这对每个动画重复,如果你点击动画 1,当动画结束时,它会倒退计数器 5 秒,但是在任何动画中按下这 5 秒,计数器应该被取消。我能管理吗?直到现在使用 dispatch_after 但没有如何取消

如果您希望您的操作是可取消的,一种简单的方法是使用 NSBlockOperation

let operation = NSBlockOperation()
operation.addExecutionBlock { () -> Void in
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(5 * NSEC_PER_SEC))
    dispatch_after(time, dispatch_get_main_queue(), { () -> Void in
        if operation.cancelled {
            return
        } else {
            // perform your animation
        }
    })
}

开始操作:

operation.start()

如果您想取消您的操作:

operation.cancel()

如果您的操作有多个阶段,您应该定期检查 operation.cancelled - 调用 cancel() 除了将其设置为 true 之外什么都不做。

对于更复杂的工作,您可以在一个依赖项中将多个操作链接在一起,并将它们放在一个 NSOperationQueue.