[iOS] RCTTMap.m requiresMainQueueSetup 경고 관련
716
작성한 질문수 5
우여곡절 끝에 티맵 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();
}
이 코드에 대해서도 설명 부탁드립니다.
답변 1
0
methodQueue 부분이 메인쓰레드에서 돌아가도록 하는 코드라서 requireMainQueueSetup이 YES이나 NO나 똑같은 것 같습니다.
+ (BOOL)requiresMainQueueSetup
이 메서드는 메인 스레드에서 모듈을 초기화할지 여부 , 즉 모듈의 생성자( init메소드)와 constantsToExport메서드가 메인 스레드에서 호출되는지 여부를 결정합니다.- (dispatch_queue_t)methodQueue
이 방법은 대안입니다 . 모듈의 내보내기 방법 (매크로를 사용하여 내보내기 )을 호출 RCT_EXPORT_METHOD할 때 사용할 스케줄러를 RN에게 알릴 수 있습니다 . 여기로 돌아가면 dispatch_get_main_queue()기본 스레드에 속한 기본 대기열이 반환되어 RN에게 기본 스레드에서 내보낸 메서드를 호출하도록 요청하지만 해당 요구 사항이 있는 경우 다른 사용자 지정 예약 대기열을 사용할 수 있습니다.
앱실행시 네이버맵 [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





