[SWIFT] [GCD] Grundlagen der DispatchQueue-Klasse

DispatchQueue-Klasse

Ein Objekt, das die serielle oder parallele Ausführung von Aufgaben in den Haupt- oder Hintergrundthreads der App verwaltet.

Erklärung


class DispatchQueue : DispatchObject

Versandwarteschlangen sind FIFO-Warteschlangen (First In, First Out), mit denen Anwendungen Aufgaben in Form von Blockobjekten übergeben können. Versandwarteschlangen führen Aufgaben seriell oder parallel aus. Aufgaben in der Versandwarteschlange werden in "jedem vom System verwalteten Thread" ausgeführt. ** Das System garantiert nicht, "in welchem Thread die Aufgabe ausgeführt wird", mit Ausnahme der Versandwarteschlange, die der Hauptthread der App ist. ** **.

Aufgaben werden synchron oder asynchron geplant. Wenn Sie eine Aufgabe synchron planen, wartet der Code auf die nächste Aufgabe, bis die Ausführung des Elements abgeschlossen ist. Wenn Sie Arbeitselemente asynchron planen, werden andere Aufgaben weiterhin ausgeführt, während sie an anderer Stelle ausgeführt werden.

** Ein Deadlock tritt auf, wenn versucht wird, die Arbeit synchron in der Hauptwarteschlange auszuführen. ** **.

Erstellen Sie keine zusätzlichen Threads

Vermeiden Sie beim Entwerfen von Aufgaben, die parallel ausgeführt werden, das Aufrufen von "Methoden, die das Ausführen von Threads blockieren". Wenn eine "von einer parallelen Versandwarteschlange geplante Aufgabe" diesen Thread blockiert, erstellt das System einen zusätzlichen Thread, um "andere parallele Aufgaben in der Warteschlange" auszuführen. Wenn zu viele Aufgaben blockiert sind, können dem System die Threads in der App ausgehen.

Durch das Erstellen einer "privaten parallelen Versandwarteschlange" können auch die Threads Ihrer App entleert werden. Jede Versandwarteschlange verbraucht Thread-Ressourcen, sodass beim Erstellen zusätzlicher paralleler Versandwarteschlangen immer mehr Threads verbraucht werden. Anstatt eine private parallele Warteschlange zu erstellen, senden Sie die Aufgabe an die "Parallele globale Versandwarteschlange". Setzen Sie für serielle Aufgaben das Ziel für die serielle Warteschlange auf eine der "simultanen globalen Warteschlangen". Auf diese Weise können Sie das Verhalten serieller Warteschlangen beibehalten und gleichzeitig "Warteschlangen, die separate Threads erstellen" minimieren.

Eigentum

Haupteigenschaft

Die Versandwarteschlange, die dem Hauptthread des aktuellen Prozesses zugeordnet ist.

Erklärung


class var main: DispatchQueue { get }

Das System ordnet die automatisch erstellte Hauptwarteschlange dem Hauptthread der Anwendung zu. Die App führt einen "Block an die Hauptwarteschlange gesendet" in einem der folgenden Ansätze aus.

Das Aufrufen der Methoden "suspend ()", "resume ()" und "dispatch_set_context (_: _ :)" für die Warteschlange in dieser Eigenschaft hat keine Auswirkungen auf die Warteschlange.

Wenn der Hauptthread nicht zu lange antwortet, wird möglicherweise eine Ausnahme "0x8badf00d" für den Hauptthread von "mach_msg_trap" angezeigt. Unter iOS kann diese Ausnahme auftreten, wenn eine App feststellt, dass sie nicht rechtzeitig auf ein bestimmtes UI-Ereignis reagiert hat. Unter iOS gibt es einen Wachhund, der die Reaktionsfähigkeit der Benutzeroberfläche überwacht.

Wenn Ihre App Aufgaben hat, deren Ausführung lange dauert, z. B. die Netzwerkkonnektivität, führen Sie sie in der globalen Warteschlange des Systems oder in einer anderen Hintergrundversandwarteschlange aus. Verwenden Sie nach Möglichkeit asynchrone Aufrufe.

Methode

globale (qos :) Methode

Gibt eine "globale Systemwarteschlange" mit einer angegebenen Servicequalitätsstufe zurück.

Erklärung


class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue

Diese Methode gibt die beste Warteschlange zurück, um die Aufgabe mit der angegebenen Servicequalität auszuführen. Das Aufrufen der Funktionen "suspend ()", "resume ()" und "dispatch_set_context (_: _ :)" wirkt sich nicht auf die zurückgegebene Warteschlange aus. Aufgaben, die an die zurückgegebene Warteschlange gesendet werden, werden parallel zueinander geplant.

Ein Beispiel für das Erstellen einer Hintergrundwarteschlange mit einem Standard-Servicequalitätsniveau


let backgroundQueue = DispatchQueue.global(qos: .default)

Initialisierer

init(label:qos:attributes:autoreleaseFrequency:target:) Erstellen Sie eine neue Versandwarteschlange, die "Codeblöcke" senden kann.

Erklärung


convenience init(label: String, 
                   qos: DispatchQoS = .unspecified, 
            attributes: DispatchQueue.Attributes = [], 
  autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, 
                target: DispatchQueue? = nil)

Unten finden Sie eine Beschreibung der Parameter.

--. Inherit (erbt die Häufigkeit der automatischen Freigabe der Zielwarteschlange) --. WorkItem (wird freigegeben, nachdem die Blockausführung abgeschlossen ist) --. Never (Der Block wird auch nach der Ausführung nicht automatisch freigegeben.)

Beispiel für das Erstellen einer privaten Hintergrundwarteschlange


let videoDataOutputQueue = DispatchQueue(label: "VideoDataOutput", 
                                           qos: .userInitiated, 
                                    attributes: [], 
                          autoreleaseFrequency: .workItem)

Recommended Posts

[GCD] Grundlagen der DispatchQueue-Klasse
[GCD] Grundlagen der parallelen Programmierung in Swift
Grundlagen von Ruby
[Ruby] Zusammenfassung der Klassendefinitionen. Beherrsche die Grundlagen.
Verwendung der Datumsklasse
Grundlagen der Try-with-Resources-Anweisung
[Ruby] Klassenverschachtelung, Vererbung und die Grundlagen des Selbst
[Rails] Einführung in die Grundlagen der Entwicklung
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
Grundlagen der Zeichenoperation (Java)
Beispiel für die Verwendung einer abstrakten Klasse
[Java] Komparator der Collection-Klasse
Falle der Klasse asList of Arrays
Zusammenfassung der Grundlagen der Java-Sprache
Zusammenfassung der Java Math Klasse
[Java-Grundlagen] Was ist Klasse?
Grundlagen der bedingten Verzweigung und Rückkehr
Über die Grundlagen der Android-Entwicklung
Verschiedene Methoden der Java String Klasse
Die Grundlagen von SpringBoot + MyBatis + MySQL
[Ruby] Grundlagen zu Datum, Uhrzeit und Datumszeit
Verschiedene Methoden der String-Klasse
Grundlagen von Ruby ~ Rückblick auf schwer verständliche ~
Grundlagen von Ruby 2 ~ Rückblick auf schwer verständliche ~