IT

현재 글자가 메인 보드인지 확인

lottoking 2020. 7. 20. 07:19
반응형

현재 글자가 메인 보드인지 확인


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

스위프트 3에서

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
}

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

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

        block();

    } else {

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            block();

        }];

    }

}

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


두 가지 방법. @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());
}

스위프트 버전


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 에서이 답변을 확인 하십시오.


업데이트 : @demosten에서 언급했듯이 queue.h 헤더에 따르면 올바른 해결책이 아닌 것 같습니다 .

이 기능이 필요했을 때 첫 번째 생각은 다음과 같습니다.

dispatch_get_main_queue() == dispatch_get_current_queue();

그리고 수용된 솔루션을 찾았습니다.

[NSThread isMainThread];

광산 솔루션 2.5 배 더 빠릅니다.

PS 그리고 예, 확인했습니다. 모든 스레드에서 작동합니다.

참고 URL : https://stackoverflow.com/questions/3546539/check-whether-or-not-the-current-thread-is-the-main-thread

반응형