Ich versuche, einige Thread-sichere Methoden zu schreiben, also verwende ich:
%Vor%Aber wenn ich auf dem Hauptthread bin, der nicht notwendig ist, und ich kann alle diese Dispatch-Anrufe überspringen, so würde ich gerne wissen, in welchem Thread ich gerade bin. Wie kann ich das wissen?
Oder macht es vielleicht keinen Unterschied (in der Leistung) es zu tun?
Ist es in Ordnung, diesen Vergleich zu machen?
%Vor%Aktualisierte Antwort :
Die Apple Docs haben sich geändert und sagen jetzt "Wenn diese Funktion außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, gibt sie die Hauptwarteschlange zurück, wenn der Aufruf vom Hauptthread ausgeführt wird. Wenn der Aufruf von einem anderen Thread ausgeführt wird, Diese Funktion gibt die Standardwarteschlange für die Warteschlange zurück. " also sollte dispatch_get_main_queue() == dispatch_get_current_queue()
funktionieren.
Ursprüngliche Antwort :
Die Verwendung von dispatch_get_main_queue() == dispatch_get_current_queue()
funktioniert nicht. Die Dokumente für dispatch_get_current_queue
sagen "Wenn diese Funktion außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, gibt sie die Standardwarteschlange für die gleichzeitige Ausführung zurück". Die standardmäßig vorhandene Warteschlange ist nicht die Hauptwarteschlange.
[NSThread isMainThread]
sollte für das funktionieren, was Sie wollen. Beachten Sie, dass [NSThread isMainThread]
jedoch auch für andere Warteschlangen als die Hauptwarteschlange gelten kann, z. B. beim Aufrufen von dispatch_sync
aus dem Hauptthread.
Mit der Abschreibung von dispatch_get_current_queue()
entspricht das Äquivalent von (dispatch_get_main_queue() == dispatch_get_current_queue())
ist jetzt durch einen Vergleich der Warteschlangenmarkierung, der lautet:
%Vor%Aktualisierte Antwort:
dispatch_get_current_queue () ist jetzt veraltet.
Ursprüngliche Antwort:
Unter OS-X 10.8 wird in der Header-Datei (queue.h) im Kommentar über der Funktion dispatch_get_current_queue () geschrieben:
Wenn dispatch_get_current_queue () für den Haupt-Thread aufgerufen wird, kann dies der Fall sein oder gibt möglicherweise nicht den gleichen Wert wie dispatch_get_main_queue () zurück. Ein Vergleich der beiden ist kein gültiger Weg zu testen, ob Code ausgeführt wird auf dem Hauptthread.
Ich habe das wegen eines
entdeckt assert(dispatch_get_current_queue() == dispatch_get_main_queue());
in meinem Code, der unter iOS gut funktioniert, aber unter OS-X nicht funktioniert.
Es ist nicht sicher, dispatch_get_current_queue()
zu verwenden, außer Sie debuggen nicht. Wie es klar geschrieben ist auf der Manpage dispatch_queue
:
Höhlungen
Code kann keine Annahmen über die von
dispatch_get_current_queue()
zurückgegebene Warteschlange treffen. Die zurückgegebene Warteschlange kann über willkürliche Richtlinien verfügen, die Code möglicherweise überraschen, der versucht, mit der Warteschlange zu arbeiten. Die Liste der Richtlinien umfasst, ist aber nicht beschränkt auf, die Warteschlangenbreite (d. H. Seriell vs. gleichzeitig), die Planungspriorität, die Sicherheitsanmeldeinformationen oder die Dateisystemkonfiguration. Daher mussdispatch_get_current_queue()
nur für Identitätstests oder Debugging verwendet werden.
Die bessere Sache (vielleicht komplizierter) ist, die Hintergrundthreads zu synchronisieren:
%Vor%Vielleicht bin ich völlig falsch, aber das ist es, was ich vorschlage.
Eigentlich ist es in Ordnung zu verwenden.
Die Dokumentation sagt
Wenn von außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, wird dies angezeigt Funktion gibt die Hauptwarteschlange zurück, wenn der Aufruf vom main ausgeführt wird Thread Wenn der Anruf von einem anderen Thread stammt, diese Funktion Gibt die Standardwarteschlange für die Warteschlange zurück.
dispatch_get_current_queue
ist ab iOS 6.0 veraltet. Sieht aus wie [NSThread isMainThread]
ist der einzige Weg zu gehen.
Tags und Links objective-c multithreading grand-central-dispatch cocoa