1

Ich finde, dass in einigen Fällen das Ergebnis, dass ich [self doSomething] direkt ausführen, unterscheidet sich von dem ich ausführen in dem Block eines GCD Körpers wie folgt aus:Was ist der Unterschied zwischen einer Methode direkt und im Block von dispatch_async ausführen (dispatch_get_main_queue(),^{})

dispatch_async(dispatch_get_main_queue(), ^{ 

    [self doSomething] 

}) 

I zu erfüllen haben [NSThread current] bestätigen es auf dem Haupt-Thread bereits war. Was ist der Unterschied?

+0

Das obige wird es auf den Haupt-Thread "asynchron" beim nächsten Lauf-Zyklus versenden. Durch den Aufruf einer Funktion wird der aktuelle Thread bis zum Abschluss blockiert. – Brandon

+2

Die Absicht, asynchron etwas an die Hauptwarteschlange zu senden, während es bereits im Hauptthread ist, besteht lediglich darin, alles zu beenden, was gerade im Hauptthread läuft. IMHO, es ist oft ein Code-Geruch für ein tieferes Design-Problem. Sie werden dies sehen, wenn sich der Entwickler in der Mitte eines Ereignishandlers befindet und die nächste Aufgabe initiieren möchte, aber es würde Probleme verursachen, wenn es sofort gestartet wird, sodass sie es zurück in die Hauptwarteschlange schicken. Wenn Sie teilen, in welchem ​​Kontext Sie dieses Muster gesehen haben, können wir weiter kommentieren. – Rob

Antwort

2

Nur [self doSomething] wird Anruf synchronisiert und mit dispatch_async wird asynchroner Anruf sein.

Statement A 
[self doSomething] 
Statement B 

Above Code startet Anweisung Eine Ausführung, Statement A beenden, Start-Funktion Ausführung doSomething, Finish Funktion doSomething und dann starten und beenden Statement B Ausführung.

Statement A 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self doSomething] 
}) 
Statement B 

Above Block Start und Ziel der Ausführung von Statement A, dann fügt sie doSomething Funktionsaufruf in der Warteschlange (es kann oder möglicherweise nicht gestartet sofort), dann wird er die Ausführung von Statement B starten, ohne zu warten Ausführung der Funktion zu beenden doSomething .

Also, wenn Statement B (und andere Aussagen, die nach Ihrem Funktionsaufruf sind) ist unabhängig von Ergebnis der Funktion doSomething, dann können Sie Async-Aufruf tun.

+0

Also ist es schwer zu wissen, ob doSth oder Statement B zuerst auf der zweiten Bedingung ausgeführt wird? – wkx

+0

@wkx, ja, es ist schwer zu wissen, welche Anweisung die Ausführung zuerst für die zweite Bedingung beendet. – Hardik

Verwandte Themen