如何在Swift 3中编程延迟

在早期版本的Swift中,可以使用下面的代码创build一个延迟:

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.now转换为期望值dispatch_time_t aka UInt64

在Swift 3中运行一系列代码之前,如何创build一个延迟?

经过大量的研究,我终于弄明白了这一点。

 let when = DispatchTime.now() + 2 // change 2 to desired number of seconds DispatchQueue.main.asyncAfter(deadline: when) { // Your code with delay } 

这在Swift 3和Swift 4中创build了期望的“等待”效果。

受到这个答案的一部分的启发。

我喜欢GCD的单行符号,它更优雅:

  DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) { // do stuff 42 seconds later } 

此外,在iOS 10中,我们有新的Timer方法,例如块初始值设定项:

(如此延迟的行动可能会被取消)

  let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in // do stuff 42 seconds later } 

顺便说一下,请记住:默认情况下,计时器被添加到默认的运行循环模式。 这意味着当这个循环模式被搁置时,定时器可能会被冻结(例如,滚动UIScrollView时)。您可以通过将计时器添加到特定的运行循环模式来解决此问题:

 RunLoop.current.add(timer, forMode: .commonModes) 

在这篇博文中,你可以find更多的细节。

尝试在Swift 3.0中实现的以下function

 func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) { DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { completion() } } 

用法

 delayWithSeconds(1) { //Do something }