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 seconds
als eine Double
Quelle der Verwirrung zu sein scheint (insbesondere, da wir es gewohnt waren, ns hinzuzufügen). Diese Double
Syntax "Sekunden hinzufügen als " funktioniert, weil a deadline
ist DispatchTime
und hinter den Kulissen gibt es einen +
Operator, der a benötigt Double
und so viele Sekunden zum DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
Wenn Sie jedoch wirklich eine Ganzzahl von ms, μs oder ns DispatchTime
hinzufügen möchten , können Sie auch a DispatchTimeInterval
zu 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 DispatchTime
Klasse 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 deinit
wird. 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 isCancelled
innerhalb des Blocks).