Wie verwende ich Threading in Swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
ios
swift
multithreading
dispatch-queue
Anshul
quelle
quelle
]
vor dem Semikolon in der letzten Zeile?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Antworten:
Swift 3.0+
In Swift 3.0 wurde viel modernisiert . Das Ausführen von etwas im Hintergrund-Thread sieht folgendermaßen aus:
Swift 1.2 bis 2.3
Pre Swift 1.2 - Bekanntes Problem
Ab Swift 1.1 hat Apple die obige Syntax ohne einige Änderungen nicht unterstützt. Übergeben
QOS_CLASS_BACKGROUND
hat nicht wirklich funktioniert, sondern verwendetInt(QOS_CLASS_BACKGROUND.value)
.Weitere Informationen finden Sie in der Dokumentation zu Äpfeln
quelle
Async.background {}
Die beste Vorgehensweise besteht darin, eine wiederverwendbare Funktion zu definieren, auf die mehrmals zugegriffen werden kann.
WIEDERVERWENDBARE FUNKTION:
zB irgendwo wie AppDelegate.swift als globale Funktion.
Hinweis: in Swift 2.0 ersetzen QOS_CLASS_USER_INITIATED.value oben mit QOS_CLASS_USER_INITIATED.rawValue statt
VERWENDUNGSZWECK:
A. So führen Sie einen Prozess im Hintergrund mit einer Verzögerung von 3 Sekunden aus:
B. Um einen Prozess im Hintergrund auszuführen, führen Sie eine Vervollständigung im Vordergrund aus:
C. Um 3 Sekunden zu verzögern - beachten Sie die Verwendung des Abschlussparameters ohne Hintergrundparameter:
quelle
if(background != nil){ background!(); }
mitbackground?()
einer etwas swiftier Syntax?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
aber dies wirft einen Fehler wiecannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Eine funktionierende Lösung finden Sie hier (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).Dan Beaulieus Antwort in swift5 (funktioniert auch seit swift 3.0.1).
Swift 5.0.1
Verwendungszweck
quelle
background
Schließung ist sehr sehr sehr lang (~ = unendlich). Diese Methode ist auf eine begrenzte Zeit ausgelegt: die Zeit, die Ihr Hintergrundjob zur Ausführung benötigt. Dercompletion
Abschluss wird also aufgerufen, sobald die Ausführungszeit + Verzögerung für den Hintergrundjob abgelaufen ist.Swift 3 Version
Swift 3 verwendet eine neue
DispatchQueue
Klasse zum Verwalten von Warteschlangen und Threads. Um etwas im Hintergrund-Thread auszuführen, würden Sie Folgendes verwenden:Oder wenn Sie etwas in zwei Codezeilen wollen:
In diesem Tutorial erhalten Sie auch ausführliche Informationen zu GDC in Swift 3 .
quelle
Aus dem Tutorial von Jameson Quave
Swift 2
quelle
In Swift 4.2 und Xcode 10.1
Wir haben drei Arten von Warteschlangen:
1. Hauptwarteschlange: Die Hauptwarteschlange ist eine serielle Warteschlange, die vom System erstellt und dem Hauptthread der Anwendung zugeordnet wird.
2. Globale Warteschlange: Die globale Warteschlange ist eine gleichzeitige Warteschlange, die wir in Bezug auf die Priorität der Aufgaben anfordern können.
3. Benutzerdefinierte Warteschlangen: können vom Benutzer erstellt werden. Benutzerdefinierte gleichzeitige Warteschlangen werden immer einer der globalen Warteschlangen zugeordnet, indem eine Quality of Service-Eigenschaft (QoS) angegeben wird.
Diese alle Warteschlangen können auf zwei Arten ausgeführt werden
1. Synchrone Ausführung
2. Asynchrone Ausführung
Von AppCoda: https://www.appcoda.com/grand-central-dispatch/
quelle
.background
QoS verwenden oder.userInitiated
aber für mich hat es geklappt mit.background
Swift 4.x.
Legen Sie dies in eine Datei:
und nennen Sie es dann, wo Sie brauchen:
quelle
Sie müssen die Änderungen, die Sie im Hintergrund ausführen möchten, von den Updates trennen, die Sie auf der Benutzeroberfläche ausführen möchten:
quelle
dispatch_async(dispatch_get_main_queue()) { // update some UI }
also aufgerufen, wenn die Hintergrundanweisung (Outer Block) ausgeführt wird?Gute Antworten, trotzdem möchte ich meine objektorientierte Lösung teilen. Aktuell für Swift 5 .
Bitte probieren Sie es aus: AsyncTask
Konzeptionell inspiriert von Androids AsyncTask, habe ich meine eigene Klasse in Swift geschrieben
AsyncTask ermöglicht die ordnungsgemäße und einfache Verwendung des UI-Threads. Diese Klasse ermöglicht das Ausführen von Hintergrundoperationen und das Veröffentlichen von Ergebnissen im UI-Thread.
Hier sind einige Anwendungsbeispiele
Beispiel 1 -
Beispiel 2 -
Es hat 2 generische Typen:
BGParam
- Der Typ des Parameters, der bei der Ausführung an die Task gesendet wird.BGResult
- die Art des Ergebnisses der Hintergrundberechnung.Wenn Sie eine AsyncTask erstellen, können Sie diese Typen an alles übergeben, was Sie zum Ein- und Ausgeben der Hintergrundaufgabe benötigen. Wenn Sie diese Typen jedoch nicht benötigen, können Sie sie als unbenutzt markieren, indem Sie sie einfach auf Folgendes setzen:
Void
oder mit einer kürzeren Syntax:()
Wenn eine asynchrone Aufgabe ausgeführt wird, werden drei Schritte ausgeführt:
beforeTask:()->Void
Wird im UI-Thread aufgerufen, kurz bevor die Aufgabe ausgeführt wird.backgroundTask: (param:BGParam)->BGResult
wird unmittelbar danach im Hintergrund-Thread aufgerufenafterTask:(param:BGResult)->Void
Wird im UI-Thread mit dem Ergebnis der Hintergrundaufgabe aufgerufenquelle
Da die OP-Frage bereits oben beantwortet wurde, möchte ich nur einige Überlegungen zur Geschwindigkeit hinzufügen:
Ich empfehle nicht, Aufgaben mit der Priorität .background thread auszuführen, insbesondere auf dem iPhone X, wo die Aufgabe auf den Kernen mit geringem Stromverbrauch zugewiesen zu sein scheint.
Hier sind einige reale Daten aus einer rechenintensiven Funktion, die aus einer XML-Datei (mit Pufferung) liest und Dateninterpolation durchführt:
Gerätename / .background / .utility / .default / .userInitiated / .userInteractive
Beachten Sie, dass der Datensatz nicht für alle Geräte gleich ist. Es ist das größte auf dem iPhone X und das kleinste auf dem iPhone 5s.
quelle
Swift 5
Erstellen Sie zur Vereinfachung eine Datei "DispatchQueue + Extensions.swift" mit folgendem Inhalt:
Verwendungszweck :
quelle
Grand Central Dispatch wird für Multitasking in unseren iOS-Apps verwendet.
Sie können diesen Code verwenden
Weitere Informationen erhalten Sie über diesen Link: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
quelle
Mehrzweckfunktion für Thread
Verwenden Sie es wie:
quelle
Ich mag die Antwort von Dan Beaulieu sehr, aber sie funktioniert nicht mit Swift 2.2 und ich denke, wir können diese fiesen erzwungenen Auspackungen vermeiden!
quelle
quelle
In Swift 4.2 funktioniert dies.
quelle