检查当前线程是否是主线程

有什么办法来检查当前线程是否是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!"); } } 

看看NSThread API文档 。

有类似的方法

- (BOOL)isMainThread

+ (BOOL)isMainThread

+ (NSThread *)mainThread

如果你想在主线程上执行一个方法,你可以:

 - (void)someMethod { dispatch_block_t block = ^{ // Code for the method goes here }; if ([NSThread isMainThread]) { block(); } else { dispatch_async(dispatch_get_main_queue(), block); } } 

如果你想知道你是否在主线程,你可以简单地使用debugging器。 在你感兴趣的行设置一个断点,当你的程序到达它时,调用这个:

(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 ,那么你在主线程上。

在Swift3中

 if Thread.isMainThread { print("Main Thread") } 

以下模式将确保在主线程上执行一个方法:

 - (void)yourMethod { // make sure this runs on the main thread if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(yourMethod) withObject:nil waitUntilDone:YES]; return; } // put your code for yourMethod here } 

两种方式。 从@ rano的回答,

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

也,

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

对于Monotouch / Xamarin iOS,您可以通过以下方式执行检查:

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

Swift版本


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

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

https://stackoverflow.com/a/34685535/1530581检查这个答案;

更新:似乎是不正确的解决scheme,根据queue.h头提到@demosten

首先想到的是,当我需要这个function的时候:

 dispatch_get_main_queue() == dispatch_get_current_queue(); 

并已看到接受的解决scheme:

 [NSThread isMainThread]; 

我的解决scheme快了2.5倍。

PS是的,我已经检查,它适用于所有线程