objective-c iphone multithreading cocoa xamarin.ios

objective c - Verifique si el hilo actual es el hilo principal



objective-c iphone (11)

let isOnMainQueue = (dispatch_queue_get_label (dispatch_get_main_queue ()) == dispatch_queue_get_label (DISPATCH_CURRENT_QUEUE_LABEL))

mira esta respuesta desde https://stackoverflow.com/a/34685535/1530581

¿Hay alguna manera de comprobar si el hilo actual es 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!"); } }


Dos caminos. De la respuesta de @ rano,

[[NSThread currentThread] isMainThread] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");

También,

[[NSThread mainThread] isEqual:[NSThread currentThread]] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");



El siguiente patrón asegurará que un método se ejecuta en el hilo principal:

- (void)yourMethod { // make sure this runs on the main thread if (![NSThread isMainThread]) { [self performSelectorOnMainThread:_cmd/*@selector(yourMethod)*/ withObject:nil waitUntilDone:YES]; return; } // put your code for yourMethod here }


Para Monotouch / Xamarin iOS puede realizar el control de esta manera:

if (NSThread.Current.IsMainThread) { DoSomething(); } else { BeginInvokeOnMainThread(() => DoSomething()); }


Si desea que se ejecute un método en el hilo principal, puede:

- (void)someMethod { dispatch_block_t block = ^{ // Code for the method goes here }; if ([NSThread isMainThread]) { block(); } else { dispatch_async(dispatch_get_main_queue(), block); } }


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 llegue a ella, llame a este:

(lldb) thread info

Esto mostrará información sobre el hilo en el que se encuentra:

(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 la queue es com.apple.main-thread , entonces estás en el hilo principal.


Versión Swift

if (NSThread.isMainThread()) { print("Main Thread") }


ACTUALIZACIÓN: parece que no es la solución correcta, de acuerdo con el encabezado queue.h como se menciona @demosten

El primer pensamiento fue traído a mí, cuando me necesitaban esta funcionalidad era la línea:

dispatch_get_main_queue() == dispatch_get_current_queue();

Y había buscado la solución aceptada:

[NSThread isMainThread];

la solución de mina 2.5 veces más rápido.

PS Y sí, lo había comprobado, funciona para todos los hilos


En Swift3

if Thread.isMainThread { print("Main Thread") }


void ensureOnMainQueue(void (^block)(void)) { if ([[NSOperationQueue currentQueue] isEqual:[NSOperationQueue mainQueue]]) { block(); } else { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ block(); }]; } }

tenga en cuenta que verifico la cola de operaciones, no el hilo, ya que este es un enfoque más seguro