Wie kann ich meinen Code warten lassen, bis die Aufgabe in DispatchQueue abgeschlossen ist? Benötigt es einen CompletionHandler oder so?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
Ich benutze Xcode 8.2 und schreibe in Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Bartosz Woźniak
quelle
quelle
wait
Ansatz (wenn das Blockieren für Sie kein Problem darstellt, dh wenn Sie sich nicht im Hauptthread befinden) oder stellen Sie einen Abschlusshandler bereit, oder verwenden Sie den Benachrichtigungsansatz in Ihrer aufrufenden Klasse.group.enter
außerhalb des asynchronen Blocks an? Sollte es nicht in der Verantwortung jedes Blocks liegen, die Gruppe zu betreten und zu verlassen?wait
wartet bisenter
und dieleave
Anrufe sind ausgeglichen. Wenn Sie setzenenter
in der Schließung,wait
würde nicht warten , weilenter
noch nicht und somit die Anzahl der aufgerufen wurdeenter
undleave
Anrufe werden ausgeglichen (# eingeben == 0, # leav == 0).XCTTestExpectation
stattdessen s. Siehe diesen BeispielcodeIn Swift 3 ist kein Abschluss-Handler erforderlich, wenn
DispatchQueue
eine Aufgabe abgeschlossen ist. Darüber hinaus können Sie Ihr Ziel auf verschiedene Weise erreichenEin Weg ist folgender:
Es wird warten, bis die Schleife beendet ist, aber in diesem Fall wird Ihr Haupt-Thread blockiert.
Sie können das auch so machen:
Eine letzte Sache: Wenn Sie CompletionHandler verwenden möchten, wenn Ihre Aufgabe mit DispatchQueue abgeschlossen ist, können Sie verwenden
DispatchWorkItem
.Hier ist ein Beispiel für die Verwendung
DispatchWorkItem
:quelle
Versandgruppe verwenden
quelle
DispatchQueue.global().async{}
wird die Hauptwarteschlange durch das Umschließen nicht blockiert.Swift 5-Version der Lösung
func myCriticalFunction () {var value1: String? var value2: String?
}}
quelle
Swift 4
Sie können die Async-Funktion für diese Situationen verwenden. Bei der Verwendung
DispatchGroup()
kann es manchmal zu einem Deadlock kommen.quelle