In Swift 2 konnte ich dispatch_after
eine Aktion mit Grand Central Dispatch verzögern:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Dies scheint jedoch seit Swift 3 nicht mehr zu kompilieren. Was ist die bevorzugte Methode, um dies im modernen Swift zu schreiben?
swift
swift4
grand-central-dispatch
swift5
Brandonscript
quelle
quelle
UInt64
?Antworten:
Die Syntax lautet einfach:
Beachten Sie, dass die obige Syntax des Hinzufügens
seconds
als eineDouble
Quelle der Verwirrung zu sein scheint (insbesondere, da wir es gewohnt waren, ns hinzuzufügen). DieseDouble
Syntax "Sekunden hinzufügen als " funktioniert, weil adeadline
istDispatchTime
und hinter den Kulissen gibt es einen+
Operator, der a benötigtDouble
und so viele Sekunden zumDispatchTime
:Wenn Sie jedoch wirklich eine Ganzzahl von ms, μs oder ns
DispatchTime
hinzufügen möchten , können Sie auch aDispatchTimeInterval
zu a hinzufügenDispatchTime
. Das heißt, Sie können:Diese funktionieren aufgrund dieser separaten Überladungsmethode für den
+
Operator in derDispatchTime
Klasse nahtlos .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östdeinit
wird. Wenn der Ansichtscontroller geschlossen und freigegeben wird, wird die Aufgabe abgebrochen :Beachten Sie die Verwendung der
[weak self]
Erfassungsliste in derDispatchWorkItem
. 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 dencancel()
Aufruf trifft , beendet der Block seine Ausführung (es sei denn, Sie überprüfen manuellisCancelled
innerhalb des Blocks).quelle
DispatchTimeInterval
Wiedergaben.milliseconds
erfordern wieInt
. Aber wenn ich nur Sekunden hinzufüge, würde ichDouble
zlet n: Double = 1.0; queue.asyncAfter(deadline: .now() + n) { ... }
.Swift 4:
Für die Zeit
.seconds(Int)
,.microseconds(Int)
und.nanoseconds(Int)
kann auch verwendet werden.quelle
.milliseconds
ist besser als Double.DispatchTimeInterval
Aufzählungswerte verwenden.case seconds(Int)
case milliseconds(Int)
case microseconds(Int)
case nanoseconds(Int)
.milliseconds is better than Double.
- Ich will das auf einem T-Shirt;).Wenn Sie nur die Verzögerungsfunktion in wollen
Swift 4 & 5
Sie können es verwenden wie:
quelle
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: closure)
ist einfacher.Nach der Veröffentlichung von Swift 3 muss auch das @escaping hinzugefügt werden
quelle
Ein etwas anderer Geschmack der akzeptierten Antwort.
Swift 4
quelle
Swift 4
Sie können eine Erweiterung für DispatchQueue erstellen und eine Funktionsverzögerung hinzufügen, die
DispatchQueue
intern die asyncAfter-Funktion verwendetund verwenden
quelle
Anruf
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
Ich würde dringend empfehlen, die Xcode-Tools zum Konvertieren in Swift 3 zu verwenden (Bearbeiten> Konvertieren> In aktuelle Swift-Syntax). Es hat das für mich gefangen
quelle
In Swift 4.1 und Xcode 9.4.1
Einfache Antwort ist ...
quelle
Swift 5 und höher
quelle
Keine der genannten Antworten läuft auf einem Nicht-Haupt-Thread, also addiere ich meine 2 Cent.
In der Hauptwarteschlange (Hauptthread)
ODER
In der globalen Warteschlange (kein Hauptthread, basierend auf der angegebenen QOS).
ODER
quelle
Das hat bei mir in Swift 3 funktioniert
quelle
Sie können verwenden
quelle
Versuche dies
quelle