Warum Parallelität?
Sobald Sie Ihrer App schwere Aufgaben wie das Laden von Daten hinzufügen, verlangsamt dies Ihre UI-Arbeit oder friert sie sogar ein. Mit Parallelität können Sie zwei oder mehr Aufgaben „gleichzeitig“ ausführen. Der Nachteil dieses Ansatzes ist die Gewindesicherheit, die nicht immer so einfach zu kontrollieren ist. Zum Beispiel, wenn verschiedene Aufgaben auf dieselben Ressourcen zugreifen möchten, z. B. der Versuch, dieselbe Variable in einem anderen Thread zu ändern oder auf die Ressourcen zuzugreifen, die bereits von den verschiedenen Threads blockiert wurden.
Es gibt einige Abstraktionen, die wir beachten müssen.
- Warteschlangen.
- Leistung synchroner / asynchroner Aufgaben.
- Prioritäten.
- Häufige Probleme.
Warteschlangen
Muss seriell oder gleichzeitig sein . Sowie global oder privat zugleich.
Bei seriellen Warteschlangen werden Aufgaben einzeln erledigt, während bei gleichzeitigen Warteschlangen Aufgaben gleichzeitig ausgeführt und nach unerwarteten Zeitplänen ausgeführt werden. Dieselbe Gruppe von Aufgaben benötigt in einer seriellen Warteschlange mehr Zeit als in einer gleichzeitigen Warteschlange.
Sie können Ihre eigenen privaten Warteschlangen (sowohl seriell als auch gleichzeitig ) erstellen oder bereits verfügbare globale (System-) Warteschlangen verwenden . Die Hauptwarteschlange ist die einzige serielle Warteschlange aller globalen Warteschlangen .
Es wird dringend empfohlen, keine schweren Aufgaben auszuführen, die nicht als UI-Arbeit in der Hauptwarteschlange bezeichnet werden (z. B. Laden von Daten aus dem Netzwerk), sondern in den anderen Warteschlangen, um die Benutzeroberfläche nicht eingefroren zu halten und auf die Benutzeraktionen zu reagieren. Wenn wir die Benutzeroberfläche in den anderen Warteschlangen ändern lassen, können die Änderungen nach einem anderen und unerwarteten Zeitplan und einer anderen Geschwindigkeit vorgenommen werden. Einige UI-Elemente können vor oder nach ihrer Verwendung gezeichnet werden. Es kann die Benutzeroberfläche zum Absturz bringen. Da es sich bei den globalen Warteschlangen um Systemwarteschlangen handelt, müssen einige andere Aufgaben vom System ausgeführt werden.
Servicequalität / Priorität
Warteschlangen haben auch unterschiedliche QOS (Quality of Service), die die Priorität für die Ausführung der Aufgabe festlegen ( hier von der höchsten zur niedrigsten):
.userInteractive - Hauptwarteschlange
.userInitiated - für vom Benutzer initiierte Aufgaben, bei denen der Benutzer auf eine Antwort wartet
.utility - für die Aufgaben
Dies dauert einige Zeit und erfordert keine sofortige Reaktion, z. B. Arbeiten mit Daten. Hintergrund - für Aufgaben, die nicht mit dem visuellen Teil zusammenhängen und für die Fertigstellungszeit nicht streng sind.
Es gibt auch eine
Standardwarteschlange, die die QOS- Informationen nicht überträgt . Wenn es nicht möglich war, die QOS zu erkennen dieqos wird zwischen .userInitiated und .utility verwendet .
Aufgaben können synchron oder asynchron ausgeführt werden .
Die synchrone Funktion gibt die Steuerung erst nach Abschluss der Aufgabe an die aktuelle Warteschlange zurück. Es blockiert die Warteschlange und wartet, bis die Aufgabe beendet ist.
Die asynchrone Funktion gibt die Steuerung direkt nach dem Senden der Aufgabe an die aktuelle Warteschlange zurück, um sie in der anderen Warteschlange auszuführen. Es wartet nicht, bis die Aufgabe beendet ist. Die Warteschlange wird nicht blockiert.
Häufige Probleme.
Die beliebtesten Fehler, die Programmierer beim Projizieren der gleichzeitigen Apps machen, sind folgende:
- Race Condition - Wird verursacht, wenn die App funktioniert. Dies hängt von der Reihenfolge der Ausführung der Codeteile ab.
- Prioritätsumkehrung - Wenn die Aufgaben mit höherer Priorität darauf warten, dass die Aufgaben mit kleinerer Priorität abgeschlossen werden, weil einige Ressourcen blockiert sind
- Deadlock - Wenn einige Warteschlangen unendlich lange auf die Quellen (Variablen, Daten usw.) warten, die bereits von einigen dieser Warteschlangen blockiert wurden.
Rufen Sie NIEMALS die Synchronisierungsfunktion in der Hauptwarteschlange auf .
Wenn Sie die Synchronisierungsfunktion in der Hauptwarteschlange aufrufen, wird die Warteschlange blockiert, und die Warteschlange wartet auf den Abschluss der Aufgabe. Die Aufgabe wird jedoch nie beendet, da sie aufgrund der Warteschlange nicht einmal gestartet werden kann bereits gesperrt. Es heißt Deadlock .
Wann soll die Synchronisierung verwendet werden?
Wenn wir warten müssen, bis die Aufgabe erledigt ist. Fe, wenn wir sicherstellen, dass eine Funktion / Methode nicht doppelt aufgerufen wird. Fe wir haben Synchronisation und versuchen zu verhindern, dass es doppelt aufgerufen wird, bis es vollständig fertig ist. Hier ist ein Code für dieses Problem:
Wie kann man herausfinden, was einen Fehler-Absturzbericht auf dem IOS-Gerät verursacht hat?
DispatchQueue.main.sync
von einem Hintergrund-Thread aus aufzurufen ?