inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

배달앱 클론코딩 [with React Native]

[맥 전용]섹션 5에 필요한 작업들 총정리

[iOS] RCTTMap.m requiresMainQueueSetup 경고 관련

716

Mobum Shin

작성한 질문수 5

0

우여곡절 끝에 티맵 iOS 설정을 마치고 지도가 열리는 걸 보는 기쁨도 잠시 시뮬레이터, 아이폰 모두에서 나타하는 경고가 신경쓰이는군요.

열어보면 다행인지 불행인지 길고 자세한 경고문이 나옵니다.

RCTTMap.h를 보면

@interface RCTTMap : NSObject <RCTBridgeModule> 

RCTBridgeModule을 상속하는 것 같은데 RCTBridgeModule.h을 열어보니 역시나 길고 자세한 설명이 써져 있더군요.

/**
 * Most modules can be used from any thread. All of the modules exported non-sync method will be called on its
 * methodQueue, and the module will be constructed lazily when its first invoked. Some modules have main need to access
 * information that's main queue only (e.g. most UIKit classes). Since we don't want to dispatch synchronously to the
 * main thread to this safely, we construct these modules and export their constants ahead-of-time.
 *
 * Note that when set to false, the module constructor will be called from any thread.
 *
 * This requirement is currently inferred by checking if the module has a custom initializer or if there's exported
 * constants. In the future, we'll stop automatically inferring this and instead only rely on this method.
 */

대강 해석해보면 비동기 함수를 갖는 경우 등의 이유로 모듈은 아무 쓰레드에서나 작동하는데(자기 methodQueue에서 called되는 게 기본동작), 어떤 모듈은 메인쓰레드(UIKit)의 정보에 접근할 필요가 있다는 것이고, 그럴 때는 requiresMainQueueSetup을 true(YES)로 명시적으로 지시해야 한다.. 지금은 custom init 이 있는지 등을 보고 RN이 유추해주지만 미래엔 유추를 중단할테니 requiresMainQueueSetup을 명시적으로 선언해라... 뭐 그런 내용 같네요.

좋은 내용 같긴 한데.. 티맵 모듈의 경우 만약 우리 배달앱 내에 지도를 랜더링한다면 당연히 메인쓰레드에서 동작하게 해야할텐데, 강의 방향을 보면 단순히 티맵을 열게 호출하는 기능만 하기 때문에 굳이 메인쓰레드여야 할 필요가 없는 것 아닌가 싶기도 합니다. 어떤 쪽이 맞을까요?

단순히 경고만 안 뜨게 하는 것은 쉬웠습니다. RCTTMap.m에 

+ (BOOL)requiresMainQueueSetup
{
  return YES;
}

만 넣어주면 경고도 없어지고 티맵 작동에도 지장이 없습니다. 그런데 문제는!

+ (BOOL)requiresMainQueueSetup
{
  return NO;
}

라고 넣어줘도 경고도 없어지고 티맵도 정상 작동한다는 거죠. 

openNavi() 메소드는 네이버지도 위 Marker나 Path에 대한 터치 이벤트를 핸들러로 작용하니 당연히 UI가 돌아가는 메인쓰레드에서 호출되도록 고정(return YES)해야만 하고, 백그라운드 쓰레드에서 호출되면(return NO) 오류가 나야 정상일 것 같은데 말이죠. 이유를 설명해주실 수 있나요?

선생님 교안에서도 '메인쓰레드만 쓰도록'이라고 코멘트 해놓으셨는데

- (dispatch_queue_t)methodQueue
{
    // 메인쓰레드만 쓰도록
    return dispatch_get_main_queue();
}

 이 코드에 대해서도 설명 부탁드립니다.

 

 

RCTTMap react-native requires MainQueueSetup mainThread

답변 1

0

제로초(조현영)

methodQueue 부분이 메인쓰레드에서 돌아가도록 하는 코드라서 requireMainQueueSetup이 YES이나 NO나 똑같은 것 같습니다.

 

+ (BOOL)requiresMainQueueSetup
이 메서드는 메인 스레드에서 모듈을 초기화할지 여부 , 즉 모듈의 생성자( init메소드)와 constantsToExport메서드가 메인 스레드에서 호출되는지 여부를 결정합니다.
- (dispatch_queue_t)methodQueue
이 방법은 대안입니다 . 모듈의 내보내기 방법 (매크로를 사용하여 내보내기 )을 호출 RCT_EXPORT_METHOD할 때 사용할 스케줄러를 RN에게 알릴 수 있습니다 . 여기로 돌아가면 dispatch_get_main_queue()기본 스레드에 속한 기본 대기열이 반환되어 RN에게 기본 스레드에서 내보낸 메서드를 호출하도록 요청하지만 해당 요구 사항이 있는 경우 다른 사용자 지정 예약 대기열을 사용할 수 있습니다.

0

Mobum Shin

빠른 답변 감사합니다. 공부가 되었습니다.

앱실행시 네이버맵 [401] 에러

0

1065

2

스타일링 라이브러리

0

160

2

expo, cli 선택 중에 고민이 있습니다.

0

180

2

JDK 버전이 달라도 괜찮나요?

0

240

2

dimenstion usewindowdeminstion

0

130

3

[맥 전용]환경 설정하기 1편 & [맥 전용]환경 설정하기 2편의 영상이 안나옵니다.

0

218

1

jdk11 버전과 gradle 버전의 호환성 관련 질문드립니다.

0

407

2

강의 외 질문입니다!

0

164

2

react native랑 맞는 ui 라이브러리 어떤게 좋을까요?

0

1554

2

react native와 spring boot 연결

0

365

1

java가 아닌 .kt에서 code push 에러가 발생합니다.

0

223

2

flipper 239 에러가 발생합니다.

0

173

2

package.json에 /lib/panino.js 문제입니다.

0

481

2

window - mac 협업 과정 질문합니다

0

221

1

ios 빌드 중 RCTBridgeDelegate.h import 오류

0

294

2

ios 앱 빌드 중 hermesEnabled 관련 오류발생

0

249

2

Socket 연결시 질문 드립니다.!

0

158

2

wifi 환경에서 axios 통신이 로컬서버에서 안됩니다.

0

430

2

iOS render error 질문드립니다.

0

417

2

iOS 가상머신 오류

0

173

2

npc react init 명령어 실행시 발생되는 오류

0

224

1

nom start 시 오류

0

122

1

NextJS 기반으로 만들어서 웹뷰 React Native로 배포 가능한가요?

0

1019

2

안드로이드 rn75 버전에 맞게 설정 중에 android13 다운로드에 대해서 막혔습니다!

0

187

2