Warum ist eine Ausführungsschleife erforderlich, wenn DispatchQueue.main.async im Mac-Befehlszeilentool schnell verwendet wird?

Aug 15 2020

Ich habe das Dokument von Apple gefunden, um zu verstehen, warum ich die Ausführungsschleife verwenden sollte, um die Aufgabe in der Hauptversandwarteschlange zu implementieren.

Laut Apple- Dokumentation

Die Hauptabfertigungswarteschlange ist eine global verfügbare serielle Warteschlange, die Aufgaben im Hauptthread der Anwendung ausführt. Diese Warteschlange arbeitet mit der Ausführungsschleife der Anwendung (falls vorhanden), um die Ausführung von Tasks in der Warteschlange mit der Ausführung anderer Ereignisquellen zu verzahnen, die an die Ausführungsschleife angehängt sind. Da sie im Hauptthread Ihrer Anwendung ausgeführt wird, wird die Hauptwarteschlange häufig als wichtiger Synchronisierungspunkt für eine Anwendung verwendet.

Trotzdem kann ich nicht verstehen, warum eine Run-Schleife benötigt wird. es klingt wie "es braucht eine Laufschleife, weil es eine Laufschleife braucht". Ich würde es sehr schätzen, wenn mir das jemand erklärt. Vielen Dank.

Antworten

1 matt Aug 15 2020 at 19:37

warum ich die Ausführungsschleife verwenden sollte, um die Aufgabe in der Hauptdispatch-Warteschlange zu implementieren

Normalerweise nicht, weil Sie bereits eine verwenden!

In einem Anwendungsprojekt gibt es bereits eine Hauptwarteschlangen-Laufschleife . Beispielsweise ist ein iOS-App-Projekt eigentlich nichts anderes als ein gigantischer Aufruf von UIApplicationMain, der eine Ausführungsschleife bereitstellt.

Auf diese Weise ist es in der Lage, dort zu sitzen und darauf zu warten, dass der Benutzer etwas tut. Die Laufschleife läuft, äh, läuft. Und Schleifen.

Aber beispielsweise in einem Mac-Befehlszeilentool gibt es keine automatische Ausführungsschleife. Es führt seine Hauptfunktion aus und wird sofort beendet. Wenn Sie dies nicht benötigen, würden Sie eine Run-Schleife bereitstellen.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.asyncDies ist der Fall, wenn Sie Code in einer Hintergrundwarteschlange ausführen und einen bestimmten Codeblock in der Hauptwarteschlange ausführen müssen.

In Ihrem Code viewDidLoadwird bereits in der Hauptwarteschlange ausgeführt, sodass es wenig Grund gibt, DispatchQueue.main.async zu verwenden.

Aber es ist nicht unbedingt falsch, es zu verwenden. Aber es ändert die Reihenfolge der Ausführung.

Der asynchrone Abschluss wird in die Warteschlange gestellt, um ausgeführt zu werden, nachdem die aktuelle Runloop abgeschlossen ist.

Rob Aug 15 2020 at 23:56

Ich kann nicht verstehen, warum eine Run-Schleife benötigt wird

Im Allgemeinen ist eine Ausführungsschleife für Befehlszeilen-Apps nicht erforderlich. Sie können Ausführungsschleifen verwenden, wenn Sie einen besonderen Bedarf dafür haben (z. B. wenn Sie eine dynamische Benutzeroberfläche haben, die einige Aufgaben ausführt, während Sie auf Benutzereingaben warten), aber die überwiegende Mehrheit der Befehlszeilen-Apps erfordert keine Ausführungsschleifen.

Wie die Dokumente sagen:

Eine Ausführungsschleife ist eine Ereignisverarbeitungsschleife, die Sie verwenden, um Arbeit zu planen und den Empfang eingehender Ereignisse zu koordinieren. Der Zweck einer Ausführungsschleife besteht darin, Ihren Thread beschäftigt zu halten, wenn Arbeit zu erledigen ist, und Ihren Thread in den Ruhezustand zu versetzen, wenn keine Arbeit ansteht.

Wenn Sie also Ihre App auf einige eingehende Ereignisse warten lassen müssen oder Sie Aufgaben asynchron zwischen Warteschlangen verteilen, verwenden Sie in Ordnung Run-Schleifen, aber ansonsten machen Sie sich keine Sorgen. Die meisten Befehlszeilen-Apps müssen überhaupt keine Ausführungsschleifen verwenden.