在早期版本的Swift中,可以使用以下代码创建延迟:
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
//put your code which should be executed with a delay here
}
但是现在,在Swift 3中,Xcode自动更改了6个不同的东西,但随后出现了以下错误:“不能转换DispatchTime。现在转换为期望值dispatch_time_t aka UInt64。”
在Swift 3中,如何在运行一段代码序列之前创建一个延迟?
我喜欢单行符号的GCD,它更优雅:
DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
// do stuff 42 seconds later
}
此外,在iOS 10中我们有新的定时器方法,例如块初始化器:
(因此延迟的行动可能会被取消)
let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
// do stuff 42 seconds later
}
顺便说一句,请记住:默认情况下,定时器被添加到默认的运行循环模式。这意味着当用户与应用程序的UI交互时(例如,当滚动UIScrollView时),计时器可能会被冻结。
你可以通过在特定的运行循环模式中添加定时器来解决这个问题:
RunLoop.current.add(timer, forMode: .common)
在这篇博文中你可以找到更多细节。