Ich habe das iBook von Apple durchgesehen und konnte keine Definition dafür finden:
Kann jemand die Struktur von erklären dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Kumar KL
quelle
quelle
Antworten:
Eine klarere Vorstellung von der Struktur:
dispatch_time_t
ist einUInt64
. Derdispatch_queue_t
Typ ist tatsächlich mit einem Alias versehenNSObject
, aber Sie sollten nur Ihre bekannten GCD-Methoden verwenden, um Warteschlangen abzurufen . Der Block ist ein Swift-Verschluss. Insbesonderedispatch_block_t
ist definiert als() -> Void
, was äquivalent zu ist() -> ()
.Anwendungsbeispiel:
BEARBEITEN:
Ich empfehle die wirklich schöne
delay
Funktion von @ matt .EDIT 2:
In Swift 3 wird es neue Wrapper für GCD geben. Siehe hier: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
Das ursprüngliche Beispiel würde in Swift 3 wie folgt geschrieben:
Beachten Sie, dass Sie die
deadlineTime
Deklaration als schreibenDispatchTime.now() + 1.0
und das gleiche Ergebnis erhalten können, da der+
Operator wie folgt überschrieben wird (ähnlich für-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Dies bedeutet, dass, wenn Sie das nicht verwenden
DispatchTimeInterval
enum
und nur eine Zahl schreiben, davon ausgegangen wird, dass Sie Sekunden verwenden.quelle
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
indispatch_after(1, ...
kann hier viel Verwirrung stiften. Die Leute werden denken, dass es eine Anzahl von Sekunden ist, wenn es tatsächlich eine Nanosekunde ist . Ich schlage vor, die Antwort von @brindy zu lesen, wie diese Nummer richtig erstellt wird.1
zu,dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
da dies zu Verwirrung führt. Die Leute könnten denken, dass Sie in SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
auf der Linielet delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
scheint der einzige Weg zu sein, damit es funktioniert (keine Notwendigkeit.seconds
)Ich benutze
dispatch_after
so oft, dass ich eine Dienstprogrammfunktion der obersten Ebene geschrieben habe, um die Syntax zu vereinfachen:Und jetzt können Sie so sprechen:
Wow, eine Sprache, in der Sie die Sprache verbessern können. Was wäre besser?
Update für Swift 3, Xcode 8 Seed 6
Es scheint fast nicht wert zu sein, sich damit zu beschäftigen, nachdem sie die aufrufende Syntax verbessert haben:
quelle
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
. B. ).1.0 ~~ { code...}
Swift 3+
Dies ist in Swift 3+ super einfach und elegant:
Ältere Antwort:
Um die Antwort von Cezary zu erweitern, die nach 1 Nanosekunde ausgeführt wird, musste ich Folgendes tun, um nach 4 ½ Sekunden auszuführen.
Bearbeiten: Ich habe festgestellt, dass mein ursprünglicher Code leicht falsch war. Die implizite Eingabe verursacht einen Kompilierungsfehler, wenn Sie NSEC_PER_SEC nicht in ein Double umwandeln.
Wenn jemand eine optimalere Lösung vorschlagen kann, würde ich sie gerne hören.
quelle
dispatch_get_current_queue()
. Ich habedispatch_get_main_queue()
stattdessen verwendet.dispatch_get_main_queue()
ist definitiv das, was Sie verwenden sollten. Werde Dich auf dem Laufenden halten.Die Syntax von matt ist sehr gut und wenn Sie den Block ungültig machen müssen, können Sie Folgendes verwenden:
Verwenden Sie wie folgt
Credits
Link oben scheint unten zu sein. Original Objc Code von Github
quelle
performSelector:afterDelay:
jetzt in Swift 2 verfügbar ist, sodass Sie es abbrechen können.dispatch_source_t
, da dies etwas ist, das Sie stornieren können).Einfachste Lösung in Swift 3.0 & Swift 4.0 & Swift 5.0
Verwendungszweck
quelle
Apple hat ein dispatch_after-Snippet für Objective-C :
Hier ist das gleiche Snippet, das auf Swift 3 portiert wurde :
quelle
Eine andere Möglichkeit besteht darin, Double folgendermaßen zu erweitern:
Dann können Sie es so verwenden:
Ich mag die Verzögerungsfunktion von Matt, aber aus Präferenz möchte ich lieber die Weitergabe von Schließungen einschränken.
quelle
In Swift 3.0
Versandwarteschlangen
Versand nach 5 Sekunden
quelle
Swift 3.0 Version
Führen Sie nach der Schließfunktion eine Aufgabe nach der Verzögerung im Hauptthread aus.
Nennen Sie diese Funktion wie folgt:
quelle
1) Fügen Sie diese Methode als Teil der UIViewController-Erweiterung hinzu.
Rufen Sie diese Methode in VC auf:
2)
3)
// Kompaktes Formular
quelle
Obwohl dies nicht die ursprüngliche Frage des OP ist, wurden bestimmte
NSTimer
verwandte Fragen als Duplikate dieser Frage markiert. Es lohnt sich daherNSTimer
, hier eine Antwort aufzunehmen.NSTimer
vs.dispatch_after
NSTimer
ist höher, währenddispatch_after
niedriger ist.NSTimer
ist einfacher abzubrechen. Zum Abbrechendispatch_after
muss mehr Code geschrieben werden .Eine Aufgabe verzögern mit
NSTimer
Erstellen Sie eine
NSTimer
Instanz.Starten Sie den Timer mit der Verzögerung, die Sie benötigen.
Fügen Sie eine Funktion hinzu, die nach der Verzögerung aufgerufen werden soll (unter Verwendung des Namens, den Sie für den
selector
obigen Parameter verwendet haben).Anmerkungen
timer.invalidate()
.repeats: true
.Wenn Sie ein einmaliges Ereignis haben, das nicht abgebrochen werden muss, muss die
timer
Instanzvariable nicht erstellt werden. Folgendes wird ausreichen:Siehe meine ausführlichere Antwort hier .
quelle
Verwenden Sie dies für mehrere Funktionen. Dies ist sehr hilfreich, um Animationen oder Activity Loader für statische Funktionen oder UI-Updates zu verwenden.
Beispiel: Verwenden Sie eine Animation, bevor eine tableView neu geladen wird. Oder ein anderes UI-Update nach der Animation.
quelle
Das hat bei mir funktioniert.
Swift 3:
Ziel c:
quelle
Swift 3 & 4:
Sie können eine Erweiterung für DispatchQueue erstellen und eine Funktionsverzögerung hinzufügen, die die Funktion DispatchQueue asyncAfter intern verwendet
verwenden:
quelle
Ein weiterer Helfer zum Verzögern Ihres Codes, der zu 100% schnell verwendet wird und optional die Auswahl eines anderen Threads ermöglicht , aus dem Sie Ihren verzögerten Code ausführen können:
Jetzt verzögern Sie einfach Ihren Code im Haupt-Thread wie folgt:
Wenn Sie Ihren Code auf einen anderen Thread verschieben möchten :
Wenn Sie ein Framework bevorzugen , das auch einige weitere praktische Funktionen bietet, lesen Sie HandySwift . Sie können es über Karthago zu Ihrem Projekt hinzufügen und dann genau wie in den obigen Beispielen verwenden, z.
quelle
Ich bevorzuge immer die Erweiterung anstelle von freien Funktionen.
Swift 4
Verwenden Sie wie folgt.
quelle
Verzögern des GCD-Aufrufs mit asyncAfter in Kürze
Wir können als ** Mikrosekunden , Millisekunden , Nanosekunden verzögern
quelle
In Swift 4
Verwenden Sie dieses Snippet:
quelle
Die
dispatch_after(_:_:_:)
Funktion akzeptiert drei Parameter:Die
dispatch_after(_:_:_:)
Funktion ruft den Block oder Abschluss in der Versandwarteschlange auf, der nach einer bestimmten Verzögerung an die Funktion übergeben wird. Beachten Sie, dass die Verzögerung mit derdispatch_time(_:_:)
Funktion erstellt wird. Denken Sie daran, da wir diese Funktion auch in Swift verwenden.Ich empfehle das Tutorial Raywenderlich Dispatch Tutorial durchzugehen
quelle
Verwenden Sie in Swift 5 Folgendes:
quelle
Verwenden Sie diesen Code, um nach 2,0 Sekunden eine UI-bezogene Aufgabe auszuführen.
Swift 3.0 Version
Führen Sie nach der Schließfunktion eine Aufgabe nach der Verzögerung im Hauptthread aus.
Nennen Sie diese Funktion wie folgt:
quelle
Jetzt mehr als syntaktischer Zucker für asynchrone Versendungen in Grand Central Dispatch (GCD) in Swift.
Podfile hinzufügen
Dann können Sie es so verwenden.
quelle
Swift 4 hat eine ziemlich kurze Möglichkeit, dies zu tun:
quelle
Hier ist die synchrone Version von asyncAfter in Swift:
Zusammen mit asynchronen:
quelle