在 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
.
中
我正在开发一个在每个页面上有 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
.