Als alternative Lösung zu den zuvor vorgeschlagenen Optionen können Sie eine Verzögerung basierend auf der Klasse DispatchGroup
verwenden, die dazu dient, die Ausführung mehrerer asynchroner Aufgaben zu synchronisieren:
print("Start")
print(Date())
let delay = DispatchTimeInterval.seconds(3)
let group = DispatchGroup()
group.enter()
_ = group.wait(timeout: .now() + delay)
print("Finish")
print(Date())
Die enter()
-Methode wird verwendet, um explizit anzuzeigen, dass die Ausführung des Gruppencodes begonnen hat, und die Methode wait(timeout:)
wird verwendet, um auf den Abschluss der Gruppenaufgaben zu warten. Natürlich wird dies in diesem Beispiel nie passieren, dafür wird ein Timeout angegeben, das dem erforderlichen Zeitraum entspricht.
Es ist bequem, dies als fertigen Helfer zu verwenden:
public class DispatchWait {
private init () { }
public static func `for` (_ interval: DispatchTimeInterval) {
let group = DispatchGroup()
group.enter()
_ = group.wait(timeout: .now().advanced(by: interval))
}
}
Ein Beispiel für die Verwendung von DispatchWait
:
print("Start")
print(Date())
DispatchWait.for(.seconds(3))
print("Finish")
print(Date())
Leider kann ich nicht sagen, wie genau diese Verzögerung ist und mit welcher Wahrscheinlichkeit die Methode wait(timeout:)
die weitere Ausführung des Programms viel später als die angegebene Verzögerung ermöglichen wird.
Diese Lösung ermöglicht es auch, den Code in der aktuellen Warteschlange zu verzögern, ohne ihn in einem separaten Closure ausführen zu müssen.