如何在Swift 3和4中编写dispatch_after GCD?
在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(或4)中编译。 什么是在Swift 3中使用新的Dispatch API编写的首选方法?
语法很简单:
 // to run something in 0.1 seconds DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { // your code here } 
 请注意,上面添加seconds为Double语法似乎是一个混淆的来源(尤其是因为我们习惯于添加nsec)。 由于deadline是DispatchTime ,所以“以秒为单位添加秒”的语法是DispatchTime ,在幕后还有一个+运算符,它将采用Double精度,并在DispatchTime添加那么多秒: 
 public func +(time: DispatchTime, seconds: Double) -> DispatchTime 
 但是,如果您真的想在DispatchTime添加毫秒,微秒或纳秒的整数,则还可以将DispatchTimeInterval添加到DispatchTime 。 这意味着你可以这样做: 
 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) { os_log("500 msec seconds later") } DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) { os_log("1m μs seconds later") } DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) { os_log("1.5b nsec seconds later") } 
 这些都是无缝工作的,因为DispatchTime类中+运算符的单独重载方法。 
 public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime 
Swift 4:
 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { // Code } 
 对于.seconds(Int) .microseconds(Int)和.nanoseconds(Int)也可以使用。 
如果你只是想在延迟function
斯威夫特4
 func delay(delay: Double, closure: @escaping () -> ()) { DispatchQueue.main.asyncAfter(deadline: .now() + delay) { closure() } } 
你可以像这样使用它:
 delay(delay: 1) { print("Hi!") } 
在Swift 3发布之后,还必须添加@escaping
 func delay(_ delay: Double, closure: @escaping () -> ()) { DispatchQueue.main.asyncAfter(deadline: .now() + delay) { closure() } } 
 调用DispatchQueue.main.after(when: DispatchTime, execute: () -> Void) 
我强烈build议使用Xcode工具转换为Swift 3(编辑>转换>到当前Swift语法)。 它为我抓到了这个
这在Swift 3中为我工作
 let time1 = 8.23 let time2 = 3.42 // Delay 2 seconds DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("Sum of times: \(time1 + time2)") } 
 您可以在内部创build一个使用Swift 3 DispatchAfter函数的performAfter函数 
 func performAfter(delay: TimeInterval, completion: @escaping () -> Void) { DispatchQueue.main.asyncAfter(deadline: .now() + delay) { completion() } } 
并使用
 performAfter(delay: 2) { print("task to be done") } 
您可以使用
 DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(100)) { // Code } 
接受答案有些不同。
斯威夫特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)") } 
尝试这个
 let when = DispatchTime.now() + 1.5 DispatchQueue.main.asyncAfter(deadline: when) { //some code }