Die Syntax lautet einfach:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
Beachten Sie, dass die obige Syntax des Hinzufügens secondsals eine DoubleQuelle der Verwirrung zu sein scheint (insbesondere, da wir es gewohnt waren, ns hinzuzufügen). Diese DoubleSyntax "Sekunden hinzufügen als " funktioniert, weil a deadlineist DispatchTimeund hinter den Kulissen gibt es einen +Operator, der a benötigt Doubleund so viele Sekunden zum DispatchTime:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
Wenn Sie jedoch wirklich eine Ganzzahl von ms, μs oder ns DispatchTimehinzufügen möchten , können Sie auch a DispatchTimeIntervalzu a hinzufügen DispatchTime. Das heißt, Sie können:
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")
}
Diese funktionieren aufgrund dieser separaten Überladungsmethode für den +Operator in der DispatchTimeKlasse nahtlos .
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
Es wurde gefragt, wie man eine versendete Aufgabe storniert. Verwenden Sie dazu DispatchWorkItem. Dadurch wird beispielsweise eine Aufgabe gestartet, die in fünf Sekunden ausgelöst deinitwird. Wenn der Ansichtscontroller geschlossen und freigegeben wird, wird die Aufgabe abgebrochen :
class ViewController: UIViewController {
private var item: DispatchWorkItem?
override func viewDidLoad() {
super.viewDidLoad()
item = DispatchWorkItem { [weak self] in
self?.doSomething()
self?.item = nil
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: item!)
}
deinit {
item?.cancel()
}
func doSomething() { ... }
}
Beachten Sie die Verwendung der [weak self]Erfassungsliste in der DispatchWorkItem. Dies ist wichtig, um einen starken Referenzzyklus zu vermeiden. Beachten Sie auch, dass dies keine vorbeugende Stornierung bewirkt, sondern nur den Start der Aufgabe stoppt, falls dies noch nicht geschehen ist. Wenn es jedoch bereits gestartet ist, als es auf den cancel()Aufruf trifft , beendet der Block seine Ausführung (es sei denn, Sie überprüfen manuell isCancelledinnerhalb des Blocks).