Existe alguma maneira de verificar se o thread atual é ou não o thread principal no Objective-C?
Eu quero fazer algo assim.
- (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
batata de peixe
fonte
fonte
Respostas:
Dê uma olhada na
NSThread
documentação da API .Existem métodos como
- (BOOL)isMainThread
+ (BOOL)isMainThread
e
+ (NSThread *)mainThread
fonte
Se você deseja que um método seja executado no encadeamento principal, você pode:
fonte
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
vez dedispatch_async()
no seu exemplo.Na Swift3
fonte
Se você quiser saber se está ou não no segmento principal, basta usar o depurador. Defina um ponto de interrupção na linha em que você está interessado e, quando seu programa chegar, chame isto:
(lldb) thread info
Isso exibirá informações sobre o segmento em que você está:
(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
Se o valor for
queue
forcom.apple.main-thread
, você estará no segmento principal.fonte
O padrão a seguir garantirá que um método seja executado no encadeamento principal:
fonte
_cmd
usará automaticamente o método em que seu snippet é colado em ʔ • ᴥ • ʔDois caminhos. Da resposta de @ rano,
Além disso,
fonte
note que eu verifico a fila de operações, não o thread, pois essa é uma abordagem mais segura
fonte
Para o Monotouch / Xamarin iOS, você pode executar a verificação desta maneira:
fonte
Versão rápida
fonte
verifique esta resposta em https://stackoverflow.com/a/34685535/1530581
fonte
Detalhes
Solução 1. Detecte qualquer fila
Obter o DispatchQueue atual?
Solução 2. Detectar apenas a fila principal
Uso
Amostra
Resultado (log)
fonte
fonte
UPDATE: parece que a solução não está correta, de acordo com o cabeçalho queue.h, como mencionado @demosten
O primeiro pensamento foi trazido a mim, quando eu precisava dessa funcionalidade:
E procurou a solução aceita:
solução da mina 2,5 vezes mais rápido.
PS E sim, eu verifiquei, funciona para todos os threads
fonte
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.