Есть ли способ проверить, является ли текущий поток основным потоком в Objective-C?
Я хочу сделать что-то подобное.
- (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
рыба картофель
источник
источник
Ответы:
Взгляните на
NSThread
документацию по API .Есть такие методы, как
- (BOOL)isMainThread
+ (BOOL)isMainThread
и
+ (NSThread *)mainThread
источник
Если вы хотите, чтобы метод выполнялся в основном потоке, вы можете:
источник
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
вместо этогоdispatch_async()
в своем примере.В Swift3
источник
Если вы хотите знать, находитесь ли вы в основном потоке, вы можете просто использовать отладчик. Установите точку останова в интересующей вас строке, и когда ваша программа достигнет ее, вызовите это:
(lldb) thread info
Это отобразит информацию о вашей цепочке:
(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
Если значение
queue
равноcom.apple.main-thread
, то вы находитесь в основном потоке.источник
Следующий шаблон гарантирует, что метод выполняется в основном потоке:
источник
_cmd
будет автоматически использовать метод, в котором ваш фрагмент вставлен в ʕ • ᴥ • ʔДва пути. Из ответа @rano,
Также,
источник
обратите внимание, что я проверяю очередь операций, а не поток, так как это более безопасный подход
источник
Для Monotouch / Xamarin iOS вы можете выполнить проверку следующим образом:
источник
Быстрая версия
источник
проверьте этот ответ на https://stackoverflow.com/a/34685535/1530581
источник
подробности
Решение 1. Обнаружить любую очередь
Получить текущую DispatchQueue?
Решение 2. Определить только основную очередь
использование
Образец
Результат (журнал)
источник
источник
ОБНОВЛЕНИЕ: кажется, что это неправильное решение, согласно заголовку queue.h, как упоминалось @demosten
Первая мысль пришла мне в голову, когда мне понадобился этот функционал, это строка:
И посмотрел на принятое решение:
мой раствор в 2,5 раза быстрее.
PS И да, я проверил, работает для всех потоков
источник
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.