gpt4 book ai didi

swift - dispatch_after 快速解释

转载 作者:可可西里 更新时间:2023-10-31 23:57:07 25 4
gpt4 key购买 nike

我目前正在做一个项目,其中一部分我需要在一段时间后取消突出显示一个按钮。我决定使用 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() 将 block 排入队列以在特定时间执行在某个队列上。在您的情况下,队列是“主队列”这是“与应用程序主线程关联的串行调度队列”。所有 UI 元素只能在主线程上修改。

dispatch_after()when: 参数是一个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 是每毫秒的纳秒数,所以

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 秒的偏移量。

总结:您的代码将要在 main 上执行的 block 排入队列从现在起 1000 毫秒后线程。

更新:请参阅 How do I write dispatch_after GCD in Swift 3 and 4?语法是如何改变的在 Swift 3 中。

关于swift - dispatch_after 快速解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29861808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com