dispatch_after迅速解释

时间:2015-04-25 06:27:40

标签: xcode swift

我目前正在开发一个项目,其中一部分我需要在一段时间后取消按下按钮。我决定使用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

            }

1 个答案:

答案 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中。