[objective-c] 현재 스레드가 메인 스레드인지 확인

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!");
    }
  }



답변

NSThreadAPI 문서를 살펴보십시오 .

다음과 같은 방법이 있습니다.

- (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);
    }
}


답변

Swift3에서

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

의 값 queuecom.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
}


답변

두 가지 방법. @rano의 대답에서,

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

또한,

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


답변

void ensureOnMainQueue(void (^block)(void)) {

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

        block();

    } else {

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            block();

        }];

    }

}

더 안전한 접근 방식이므로 스레드가 아닌 작업 대기열을 확인합니다.