web-dev-qa-db-ja.com

現在のスレッドがメインスレッドであるかどうかを確認します

現在のスレッドが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!");
    }
  }
116
fish potato

NSThread AP​​Iドキュメント をご覧ください。

のような方法があります

- (BOOL)isMainThread

+ (BOOL)isMainThread

および+ (NSThread *)mainThread

159
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);
    }
}
21
boherna

In Swift

if Thread.isMainThread {
    print("Main Thread")
}
17
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、あなたはメインスレッドにいます。

12
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

迅速なバージョン


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 からこの回答を確認してください

1
JerryZhou