it-swarm.com.ru

Проверьте, является ли текущий поток основным потоком

Есть ли способ проверить, является ли текущий поток основным потоком в 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!");
    }
  }
111
fish potato

Ознакомьтесь с NSThread документацией API

Есть такие методы, как 

- (BOOL)isMainThread 

+ (BOOL)isMainThread 

и + (NSThread *)mainThread

154
rano

Если вы хотите, чтобы метод выполнялся в главном потоке, вы можете:

- (void)someMethod
{
    dispatch_block_t block = ^{
        // Code for the method goes here
    };

    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_async(dispatch_get_main_queue(), block);
    }
}
20
boherna

В Swift3  

if Thread.isMainThread {
    print("Main Thread")
}
15
dimo hamdy

Если вы хотите знать, находитесь ли вы в главном потоке или нет, вы можете просто использовать отладчик. Установите точку останова на интересующей вас строке, и когда ваша программа достигнет ее, вызовите это:

(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, то вы находитесь в главном потоке. 

11
Eric

Следующий шаблон обеспечит выполнение метода в основном потоке:

- (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
}
6
T.J.
void ensureOnMainQueue(void (^block)(void)) {

    if ([[NSOperationQueue currentQueue] isEqual:[NSOperationQueue mainQueue]]) {

        block();

    } else {

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            block();

        }];

    }

}

обратите внимание, что я проверяю очередь операций, а не поток, так как это более безопасный подход

3
Peter Lapisu

Для Monotouch/Xamarin iOS вы можете выполнить проверку следующим образом:

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

Два пути. Из ответа @ rano, 

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

Также,

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

Swift Version


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

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

проверить этот ответ от https://stackoverflow.com/a/34685535/1530581

0
JerryZhou