dispatch_after迅速解释

Sac*_*hin 2 grand-central-dispatch 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

            }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 11

让我们把它分解成多个陈述:

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
}
Run Code Online (Sandbox Code Playgroud)

dispatch_after()将块排队以在特定队列上的某个特定时间执行.在您的情况下,队列是"主队列",它是"与应用程序的主线程关联的串行调度队列".必须仅在主线程上修改所有UI元素.

所述when:的参数dispatch_after()是一个dispatch_time_t 被记录为"时间稍微抽象表示". dispatch_time()是一个计算该时间值的效用函数.它需要一个初始时间,在这种情况下DISPATCH_TIME_NOW"表示立即发生的时间",并添加一个以纳秒为单位指定的偏移量:

let when = dispatch_time(DISPATCH_TIME_NOW, Int64(1000 * Double(NSEC_PER_MSEC)))
Run Code Online (Sandbox Code Playgroud)

NSEC_PER_MSEC = 1000000 是每毫秒的纳秒数,所以

Int64(1000 * Double(NSEC_PER_MSEC))
Run Code Online (Sandbox Code Playgroud)

是1000*1000000纳秒= 1000毫秒=一秒的偏移量.

显式类型转换是必要的,因为Swift不会在类型之间隐式转换.使用Double确保它也适用于类似的情况

let when = dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC)))
Run Code Online (Sandbox Code Playgroud)

指定0.3秒的偏移量.

简介:您的代码将从现在开始在1000毫秒内将主要线程上执行的块排入队列.

更新:请参阅如何在Swift 3和4中编写dispatch_after GCD?关于如何在Swift 3中更改语法.