2017-07-19 1 views
0

Warum mich dispatchQueue.main die Möglichkeit zu geben, sync oder async wenn Haupt-Warteschlange immer synchronisierenWarum hat mir die Möglichkeit, sync oder async dispatchQueue.main zu geben, wenn Haupt-Warteschlange immer synchron ist

dispatchQueue.main.async{ 
    //code 
} 

dispatchQueue.main.async{ 
    //code 
} 

Ist gleich wie

dispatchQueue.main.sync{ 
    //code 
} 

dispatchQueue.main.sync{ 
    //code 
} 

Also ich frage mich, ob es einen Unterschied

+1

* "wenn Hauptwarteschlange immer sync ist" * - meinst du "seriell"? –

+1

Es gibt serielle und gleichzeitige Warteschlangen, die Sie synchron und asynchron an beide senden können. –

+0

Mögliches Duplikat von [Grand Central Dispatch async vs. sync] (https://stackoverflow.com/questions/9200558/grand-central-dispatch-async-vs-sync) –

Antwort

3

Die Warteschlange main unterscheidet sich nicht von anderen Warteschlangen in Bezug darauf, ob Sie synchron oder asynchron etwas in die Warteschlange stellen können.

Die einzige Regel, die Sie beachten müssen, ist, niemals sync zu verwenden, um etwas in die selbe Warteschlange einzuordnen, die gerade verwendet wird. Das wird einen Deadlock verursachen. Auch dies gilt unabhängig von der Warteschlange, Haupt oder nicht.

Um Ihre Frage zu beantworten "Ist das gleiche wie" - nein, es ist nicht das Gleiche. Unter der Annahme, dass beide Codesätze aus einer Hintergrundwarteschlange aufgerufen werden, wird sich die Hintergrundwarteschlange in dem ersten Satz von Code weiter bewegen, ohne zu berücksichtigen, wann die zwei Blöcke schließlich in der Hauptwarteschlange ausgeführt werden. In der zweiten Codegruppe (unter Verwendung von sync) blockiert die Hintergrundwarteschlange jedes Mal, bis jeder Codeblock in der Hauptwarteschlange ausgeführt wird.

Wenn beide Codesätze aus der Hauptwarteschlange aufgerufen werden, gibt es einen größeren Unterschied. Der erste Code-Satz (mit async) funktioniert weiter. Der zweite Code-Satz (mit sync) führt dazu, dass die Hauptwarteschlange beim ersten Anruf an sync blockiert wird und Ihre App nicht mehr reagiert, bis der Benutzer (oder das Betriebssystem) sie beendet.

Der einzige möglicherweise relevante Unterschied zwischen der Hauptwarteschlange und anderen Warteschlangen besteht darin, dass die Hauptwarteschlange immer eine serielle Warteschlange ist, während Hintergrundwarteschlangen entweder seriell oder gleichzeitig sein können. Beide haben jedoch eine gültige Verwendung für sync oder async, solange Sie vermeiden, sync zu verwenden, wo beide Warteschlangen identisch sind.

0

Async ist: Non Blocking, irgendwo in naher Zukunft geplant wird o n diese spezifische Warteschlange.

Synchronisierung: Wird sofort in dieser spezifischen Warteschlange ausgeführt.

Worüber Sie sprechen ist die Situation, in der Sie Code auf dem Hauptthread ausführen und etwas asynchronous oder synchronous in derselben Warteschlange senden. Für async ist das kein Problem, da dieser Block irgendwo in naher Zukunft geplant wird, wenn in dieser Warteschlange ein Zeitschlitz verfügbar ist. Ein Block sync, der in der gleichen Warteschlange ausgeführt wird, in der er aufgerufen wurde, kann jedoch blockieren.

Dies gilt nicht nur für die Hauptwarteschlange, sondern auch für jede andere Warteschlange. Wenn Sie also synchron zu einer Warteschlange senden, stellen Sie sicher, dass es sich um eine andere Warteschlange als die Warteschlange handelt, an der Sie gerade arbeiten.

+3

Diese Beschreibung ist nicht wirklich korrekt.Sowohl "async" als auch "sync" fügen den Block der Warteschlange hinzu. Der Unterschied besteht darin, ob die aktuelle Warteschlange darauf wartet, dass sie beendet wird oder nicht. Und ja, die Verwendung von "Sync", wenn beide Warteschlangen gleich sind, kann zu einem Deadlock führen. – rmaddy

+0

@rmaddy elaborierte ein wenig mehr – Simon

Verwandte Themen