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