在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 4 & 5

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

你可以这样使用它:

delay(interval: 1) { 
    print("Hi!")
}

其他回答

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

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

如果你只是想把延迟函数

Swift 4 & 5

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

你可以这样使用它:

delay(interval: 1) { 
    print("Hi!")
}

斯威夫特4:

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
   // Code
}

对于时间。秒(Int), .微秒(Int)和.纳秒(Int)也可以使用。

斯威夫特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")
}

Swift 5及以上

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