現在のスレッドが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);
}
}
In Swift
if Thread.isMainThread {
print("Main Thread")
}
メインスレッドにいるかどうかを知りたい場合は、単にデバッガーを使用できます。興味のある行にブレークポイントを設定し、プログラムがそれに到達したら、これを呼び出します:
(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
、あなたはメインスレッドにいます。
次のパターンは、メソッドがメインスレッドで実行されることを保証します。
- (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
}
void ensureOnMainQueue(void (^block)(void)) {
if ([[NSOperationQueue currentQueue] isEqual:[NSOperationQueue mainQueue]]) {
block();
} else {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
block();
}];
}
}
これはより安全なアプローチなので、スレッドではなく操作キューをチェックすることに注意してください
Monotouch/Xamarin iOSの場合、次の方法でチェックを実行できます。
if (NSThread.Current.IsMainThread)
{
DoSomething();
}
else
{
BeginInvokeOnMainThread(() => DoSomething());
}
二通り。 @ranoの答えから、
[[NSThread currentThread] isMainThread] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");
また、
[[NSThread mainThread] isEqual:[NSThread currentThread]] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");
迅速なバージョン
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 からこの回答を確認してください