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. ** **.
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.
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.
dispatchMain ()
aufDas 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.
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)
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.
label
Eine Bezeichnung, die die Warteschlange in Debugging-Tools wie Absturzberichten identifiziert. Anwendungen, Bibliotheken und Frameworks können alle ihre eigenen Versandwarteschlangen erstellen. Wir empfehlen daher den umgekehrten DNS-Benennungsstil (com.example.myqueue
). Dieser Parameter ist optional und kann "NULL" sein.
qos Die mit der Warteschlange verknüpfte Servicequalität. Dieser Wert bestimmt die Priorität der vom System geplanten Aufgaben. Eine Liste der konfigurierbaren Werte finden Sie unter DispatchQoS.QoSClass (https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass).
attributes Attribut, das der Warteschlange zugeordnet ist. Sie können das Attribut "concurrent" einfügen, um eine Versandwarteschlange zu erstellen, in der Aufgaben parallel ausgeführt werden. Wenn Sie dieses Attribut weglassen, werden die Aufgaben in der Versandwarteschlange in Reihe ausgeführt.
autoreleaseFrequency Wie oft gibt die Warteschlange automatisch "Objekte frei, die von geplanten Blöcken erstellt wurden". Eine Liste möglicher Werte finden Sie unter DispatchQueue.AutoreleaseFrequency.
--. 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