dispatch_after 在 swift 解释

dispatch_after in swift explanation

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

            }

让我们把它分解成多个语句:

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() 将块排入队列以在特定时间执行 在某个队列上。在你的例子中,队列是 "main queue" 即 "the serial dispatch queue associated with the application’s main thread"。所有 UI 元素只能在主线程上修改。

dispatch_after()when:参数是dispatch_time_t 记录为 "a somewhat abstract representation of time"。 dispatch_time() 是计算该时间值的效用函数。 它需要一个初始时间,在这种情况下 DISPATCH_TIME_NOW "indicates a time that occurs immediately",并添加一个偏移量 以纳秒为单位指定:

let when = dispatch_time(DISPATCH_TIME_NOW, Int64(1000 * Double(NSEC_PER_MSEC)))

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

Int64(1000 * Double(NSEC_PER_MSEC))

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

显式类型转换是必要的,因为 Swift 不需要 在类型之间隐式转换。使用 Double 确保它 在

等情况下也适用
let when = dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC)))

指定 0.3 秒的偏移量。

总结:您的代码将一个块排入队列以在主节点上执行 从现在起 1000 毫秒后线程。

更新: 请参阅 了解语法的变化 在 Swift 3.