检查当前线程是否是主线程
有什么办法来检查当前线程是否是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))
更新:似乎是不正确的解决scheme,根据queue.h头提到@demosten
首先想到的是,当我需要这个function的时候:
dispatch_get_main_queue() == dispatch_get_current_queue();
并已看到接受的解决scheme:
[NSThread isMainThread];
我的解决scheme快了2.5倍。
PS是的,我已经检查,它适用于所有线程