Вот удобный помощник для предотвращения повторного выполнения раздражающего вызова GCD :
public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping () -> Void) {
let dispatchTime = DispatchTime.now() + seconds
dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
}
public enum DispatchLevel {
case main, userInteractive, userInitiated, utility, background
var dispatchQueue: DispatchQueue {
switch self {
case .main: return DispatchQueue.main
case .userInteractive: return DispatchQueue.global(qos: .userInteractive)
case .userInitiated: return DispatchQueue.global(qos: .userInitiated)
case .utility: return DispatchQueue.global(qos: .utility)
case .background: return DispatchQueue.global(qos: .background)
}
}
}
Теперь вы просто задерживаете свой код в главном потоке следующим образом:
delay(bySeconds: 1.5) {
// delayed code
}
Если вы хотите задержать ваш код в другом потоке :
delay(bySeconds: 1.5, dispatchLevel: .background) {
// delayed code that will run on background thread
}
Если вы предпочитаете Framework , который также имеет некоторые более удобные функции, тогда извлекайте HandySwift . Вы можете добавить его в свой проект через Карфаген , а затем использовать его точно так же, как в примерах выше:
import HandySwift
delay(bySeconds: 1.5) {
// delayed code
}