Gibt es eine Möglichkeit zu überprüfen, ob der aktuelle Thread der Haupt-Thread in Objective-C ist oder nicht?
Ich möchte so etwas tun.
- (void)someMethod
{
if (IS_THIS_MAIN_THREAD?) {
NSLog(@"ok. this is main thread.");
} else {
NSLog(@"don't call this method from other thread!");
}
}
objective-c
iphone
multithreading
cocoa
xamarin.ios
Fischkartoffel
quelle
quelle
Antworten:
Schauen Sie sich die
NSThread
API-Dokumentation an .Es gibt Methoden wie
- (BOOL)isMainThread
+ (BOOL)isMainThread
und
+ (NSThread *)mainThread
quelle
Wenn Sie möchten, dass eine Methode im Hauptthread ausgeführt wird, können Sie:
quelle
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
anstelle vondispatch_async()
in Ihrem Beispiel verwenden.In Swift3
quelle
Wenn Sie wissen möchten, ob Sie sich im Hauptthread befinden oder nicht, können Sie einfach den Debugger verwenden. Setzen Sie einen Haltepunkt an der Zeile, an der Sie interessiert sind, und rufen Sie Folgendes auf, wenn Ihr Programm ihn erreicht:
(lldb) thread info
Daraufhin werden Informationen zu dem Thread angezeigt, in dem Sie sich befinden:
(lldb) thread info thread #1: tid = 0xe8ad0, 0x00000001083515a0 MyApp`MyApp.ViewController.sliderMoved (sender=0x00007fd221486340, self=0x00007fd22161c1a0)(ObjectiveC.UISlider) -> () + 112 at ViewController.swift:20, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
Wenn der Wert für
queue
istcom.apple.main-thread
, befinden Sie sich im Haupt-Thread.quelle
Das folgende Muster stellt sicher, dass eine Methode im Hauptthread ausgeführt wird:
quelle
_cmd
wird automatisch die Methode verwenden, mit der Ihr Snippet in ʕ • ᴥ • ʔ eingefügt wirdBeachten Sie, dass ich die Operationswarteschlange überprüfe, nicht den Thread, da dies ein sicherer Ansatz ist
quelle
Zwei Wege. Aus der Antwort von @ rano,
Ebenfalls,
quelle
Für Monotouch / Xamarin iOS können Sie die Prüfung folgendermaßen durchführen:
quelle
Schnelle Version
quelle
Überprüfen Sie diese Antwort unter https://stackoverflow.com/a/34685535/1530581
quelle
Einzelheiten
Lösung 1. Erkennen Sie eine Warteschlange
Aktuelle DispatchQueue abrufen?
Lösung 2. Erkennen Sie nur die Hauptwarteschlange
Verwendung
Stichprobe
Ergebnis (Protokoll)
quelle
quelle
UPDATE: scheint die richtige Lösung zu sein, laut queue.h Header wie erwähnt @demosten
Der erste Gedanke wurde mir gebracht, als ich gebraucht wurde, war diese Funktionalität die Linie:
Und hatte auf die akzeptierte Lösung geschaut:
Minenlösung 2,5 mal schneller.
PS Und ja, ich hatte überprüft, es funktioniert für alle Threads
quelle
When dispatch_get_current_queue() is called on the main thread, it may or may not return the same value as dispatch_get_main_queue(). Comparing the two is not a valid way to test whether code is executing on the main thread.