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");
Eche un vistazo a la documentación de NSThread
API .
Hay métodos como
- (BOOL)isMainThread
+ (BOOL)isMainThread
y + (NSThread *)mainThread
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