如何在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 } 

请注意,上面添加secondsDouble语法似乎是一个混淆的来源(尤其是因为我们习惯于添加nsec)。 由于deadlineDispatchTime ,所以“以秒为单位添加秒”的语法是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 }