我目前正在开发一个项目,其中一部分我需要在一段时间后取消按下按钮。我决定使用dispatch_after
。
我已经设法让它正常工作,但有人可以解释一下这行代码是如何工作的吗?我无法理解dispatch_after
究竟是如何运作的。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1000 * Double(NSEC_PER_MSEC))), dispatch_get_main_queue()) {
self.redButton.highlighted = false
}
答案 0 :(得分:10)
让我们把它分解成多个陈述:
let when = dispatch_time(DISPATCH_TIME_NOW, Int64(1000 * Double(NSEC_PER_MSEC)))
let queue = dispatch_get_main_queue()
dispatch_after(when, queue) {
self.redButton.highlighted = false
}
dispatch_after()
将块排队等待特定时间执行
在某个队列上。在您的情况下,队列是“主队列”
这是“与应用程序主线程关联的串行调度队列”。必须仅在主线程上修改所有UI元素。
when:
的{{1}}参数是dispatch_after()
这被记录为“有点抽象的时间表示”。
dispatch_time_t
是用于计算该时间值的效用函数。
它需要一个初始时间,在这种情况下dispatch_time()
“表示立即发生的时间”,并添加偏移量
以纳秒为单位指定:
DISPATCH_TIME_NOW
let when = dispatch_time(DISPATCH_TIME_NOW, Int64(1000 * Double(NSEC_PER_MSEC)))
是每毫秒的纳秒数,
所以
NSEC_PER_MSEC = 1000000
是1000 * 1000000纳秒= 1000毫秒= 1秒的偏移量。
显式类型转换是必要的,因为Swift没有
隐式转换类型。使用Int64(1000 * Double(NSEC_PER_MSEC))
可以确保它
也适用于像
Double
指定0.3秒的偏移量。
摘要:您的代码将在主要代码上对要执行的块进行排队 从现在起1000毫秒开始。
更新:有关语法如何更改,请参阅How do I write dispatch_after GCD in Swift 3 and 4? 在Swift 3中。