현재 글자가 메인 보드인지 확인
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);
}
}
스위프트 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
의 값 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();
}];
}
}
더 안전한 접근 방식이므로 스레드가 아닌 작업 대기열을 확인합니다.
두 가지 방법. @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 그리고 예, 확인했습니다. 모든 스레드에서 작동합니다.
'IT' 카테고리의 다른 글
패턴에 대한 파일 텍스트를 검색하고 주어진 값으로 바꾸는 방법 (0) | 2020.07.21 |
---|---|
도커 작성 영구 데이터 MySQL (0) | 2020.07.20 |
왜 우리는 Loggers를 static final로 선언합니까? (0) | 2020.07.20 |
Perl 5의 함수 타입이 나쁜 이유는 무엇입니까? (0) | 2020.07.20 |
SQL에서 뷰에 서열 변수를 있습니까? (0) | 2020.07.20 |