有时我们想让一段代码或者一个方法推迟一段时间执行,最简单的就是使用 GCD 提供的延时调用方法来实现。
1,基本用法
(1)下面代码在程序运行后打印出当前时间,然后等待个 5 秒钟再次打印时间。
import UIKit
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
print("时间1:", Date())
//延迟5秒执行
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
print("时间2:", Date())
}
}
}
(2)运行结果如下:

2,封装一个全局方法
(1)为方便使用,我们还可以封装一个全局的 delay() 方法:
import Foundation
/// 代码延迟运行
///
/// - Parameters:
/// - delayTime: 延时时间。比如:.seconds(5)、.milliseconds(500)
/// - qosClass: 要使用的全局QOS类(默认为 nil,表示主线程)
/// - closure: 延迟运行的代码
public func delay(by delayTime: TimeInterval, qosClass: DispatchQoS.QoSClass? = nil,
_ closure: @escaping () -> Void) {
let dispatchQueue = qosClass != nil ? DispatchQueue.global(qos: qosClass!) : .main
dispatchQueue.asyncAfter(deadline: DispatchTime.now() + delayTime, execute: closure)
}
(2)下面是使用样例:
//延迟5秒执行(在主线程上)
delay(by: 5) {
print("时间1:", Date())
}
//延迟5秒执行(在全局队列上,且优先级高)
delay(by: 5, qosClass: .userInitiated) {
print("时间2:", Date())
}