¿Hay alguna forma de verificar si el hilo actual es o no el hilo principal en Objective-C?
Quiero hacer algo como esto.
- (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
papa pescado
fuente
fuente
Respuestas:
Eche un vistazo a la documentación de la
NSThread
API .Hay métodos como
- (BOOL)isMainThread
+ (BOOL)isMainThread
y
+ (NSThread *)mainThread
fuente
Si desea que se ejecute un método en el hilo principal, puede:
fuente
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
lugar dedispatch_async()
en su ejemplo.En Swift3
fuente
Si desea saber si está o no en el hilo principal, simplemente puede usar el depurador. Establezca un punto de interrupción en la línea que le interesa y cuando su programa lo alcance, llame a esto:
(lldb) thread info
Esto mostrará información sobre el hilo en el que estás:
(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
Si el valor de
queue
escom.apple.main-thread
, entonces estás en el hilo principal.fuente
El siguiente patrón asegurará que un método se ejecute en el hilo principal:
fuente
_cmd
utilizará automáticamente el método en el que se pega el fragmento en ʕ • ᴥ • ʔDos caminos. De la respuesta de @ rano,
También,
fuente
tenga en cuenta que verifico la cola de operaciones, no el hilo, ya que este es un enfoque más seguro
fuente
Para Monotouch / Xamarin iOS, puede realizar la verificación de esta manera:
fuente
Versión rápida
fuente
consulte esta respuesta de https://stackoverflow.com/a/34685535/1530581
fuente
Detalles
Solución 1. Detecta cualquier cola
¿Obtener DispatchQueue actual?
Solución 2. Detecta solo la cola principal
Uso
Muestra
Resultado (registro)
fuente
fuente
ACTUALIZACIÓN: parece que no es la solución correcta, de acuerdo con el encabezado queue.h como se menciona @demosten
El primer pensamiento que se me ocurrió, cuando se necesitaba esta funcionalidad fue la línea:
Y había buscado la solución aceptada:
mina solución 2,5 veces más rápida.
PD Y sí, lo había comprobado, funciona para todos los hilos.
fuente
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.