在Swift 2中,我能够使用dispatch_after来延迟使用中央调度的动作:

var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
    // your function here 
})

但这似乎不再编译自Swift 3。在现代Swift中,首选的写法是什么?


当前回答

在Swift 3发布后,@escaping也必须被添加

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

其他回答

DispatchQueue.main打电话。after(when: DispatchTime, execute: () -> Void)

我强烈建议使用Xcode工具转换到Swift 3(编辑>转换>到当前Swift语法)。它帮我抓住了这个

斯威夫特4

您可以在DispatchQueue上创建一个扩展,并在内部添加使用DispatchQueue asyncAfter函数的函数delay

extension DispatchQueue {
   static func delay(_ delay: DispatchTimeInterval, closure: @escaping () -> ()) {
      DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: closure)
   }
}

和使用

DispatchQueue.delay(.milliseconds(10)) {
   print("task to be done")
}

一个有点不同风格的公认答案。

斯威夫特4

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 + .milliseconds(500) + 
.microseconds(500) + .nanoseconds(1000)) {
                print("Delayed by 0.1 second + 500 milliseconds + 500 microseconds + 
                      1000 nanoseconds)")
 }

Swift 5及以上

DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
   // code to execute                 
})

在Swift 3发布后,@escaping也必须被添加

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