Ich habe mit Erfolg Grand Central Dispatch in meinen Apps verwendet, aber ich habe mich gefragt, was der wahre Vorteil der Verwendung von so etwas ist:
dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff
oder auch
dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff
Ich meine, in beiden Fällen feuern Sie einen Block ab, der im Hauptthread ausgeführt werden soll, genau dort, wo die App ausgeführt wird, und dies trägt nicht dazu bei, die Last zu reduzieren. Im ersten Fall haben Sie keine Kontrolle darüber, wann der Block ausgeführt wird. Ich habe Fälle gesehen, in denen Blöcke eine halbe Sekunde nach dem Abfeuern ausgeführt wurden. Der zweite Fall ist ähnlich wie
[self doStuff];
richtig?
Ich frage mich, was ihr denkt.
Antworten:
Das Versenden eines Blocks in die Hauptwarteschlange erfolgt normalerweise aus einer Hintergrundwarteschlange, um zu signalisieren, dass einige Hintergrundverarbeitungen abgeschlossen sind, z
In diesem Fall führen wir eine lange Berechnung in einer Hintergrundwarteschlange durch und müssen unsere Benutzeroberfläche aktualisieren, wenn die Berechnung abgeschlossen ist. Das Aktualisieren der Benutzeroberfläche muss normalerweise von der Hauptwarteschlange aus erfolgen, damit wir mit einem zweiten verschachtelten dispatch_async ein Signal an die Hauptwarteschlange senden.
Es gibt wahrscheinlich andere Beispiele, bei denen Sie möglicherweise an die Hauptwarteschlange zurücksenden möchten, dies geschieht jedoch im Allgemeinen auf diese Weise, dh innerhalb eines Blocks, der an eine Hintergrundwarteschlange gesendet wird.
Warum möchten Sie möglicherweise von der Hauptwarteschlange aus in die Hauptwarteschlange versenden ? Nun, im Allgemeinen würden Sie dies nicht tun, obwohl Sie dies möglicherweise tun könnten, um einige Arbeiten für das nächste Mal in der Ausführungsschleife zu planen.
quelle
Das Versenden von Blöcken aus dem Hauptthread in die Hauptwarteschlange kann hilfreich sein. Dadurch kann die Hauptwarteschlange andere Blöcke verarbeiten, die in die Warteschlange gestellt wurden, sodass Sie nicht einfach die Ausführung aller anderen Blöcke blockieren.
Sie könnten beispielsweise einen Server mit einem einzigen Thread schreiben, der dennoch viele gleichzeitige Verbindungen verarbeitet. Solange kein einzelner Block in der Warteschlange zu lange dauert, reagiert der Server auf neue Anforderungen.
Wenn Ihr Programm nichts anderes tut, als sein ganzes Leben damit zu verbringen, auf Ereignisse zu reagieren, kann dies ganz natürlich sein. Sie müssen nur Ihre Ereignishandler so einrichten, dass sie in der Hauptwarteschlange ausgeführt werden, und dann dispatch_main () aufrufen, und Sie müssen sich möglicherweise überhaupt nicht um die Thread-Sicherheit kümmern.
quelle
Hoffentlich verstehe ich Ihre Frage richtig, indem Sie sich über die Unterschiede zwischen dispatch_async und dispatch_sync wundern?
wird den Block asynchron an eine Warteschlange senden. Dies bedeutet, dass der Block an die Warteschlange gesendet wird und nicht auf die Rückkehr gewartet wird, bevor mit der Ausführung des verbleibenden Codes in Ihrer Methode fortgefahren wird.
wird den Block synchron an eine Warteschlange senden. Dadurch wird verhindert, dass der verbleibende Code in der Methode weiter ausgeführt wird, bis die Ausführung des Blocks abgeschlossen ist.
Ich habe meistens
dispatch_async
eine Hintergrundwarteschlange verwendet, um die Arbeit aus der Hauptwarteschlange zu entfernen und die zusätzlichen Kerne des Geräts zu nutzen. Danndispatch_async
zum Haupt-Thread, wenn ich die Benutzeroberfläche aktualisieren muss.Viel Glück
quelle
Ein Ort, an dem es nützlich ist, ist für UI-Aktivitäten wie das Einstellen eines Spinners vor einer längeren Operation:
funktioniert nicht, weil Sie den Haupt-Thread während Ihrer langen Arbeit blockieren und UIKit den Spinner nicht starten lässt.
Die Steuerung wird an die Ausführungsschleife zurückgegeben, die die Aktualisierung der Benutzeroberfläche plant, den Spinner startet und dann das nächste Element aus der Versandwarteschlange entfernt, bei dem es sich um Ihre eigentliche Verarbeitung handelt. Wenn Ihre Verarbeitung abgeschlossen ist, wird der Animationsstopp aufgerufen und Sie kehren zur Ausführungsschleife zurück, in der die Benutzeroberfläche mit dem Stopp aktualisiert wird.
quelle
Swift 3, 4 & 5
Ausführen von Code im Hauptthread
quelle
Async bedeutet asynchron und sollte meistens verwendet werden. Sie sollten niemals die Synchronisierung im Hauptthread aufrufen, da dies Ihre Benutzeroberfläche blockiert, bis die Aufgabe abgeschlossen ist. Sie Hier ist ein besserer Weg, dies in Swift zu tun:
Es ist als Standardfunktion in meinem Repo enthalten. Schauen Sie sich das an: https://github.com/goktugyil/EZSwiftExtensions
quelle