dispatch_group_wait bug, async bug in React Native , ios 빌드 에러 수정

이희운 (HOSY)·2023년 6월 21일

에러

목록 보기
3/5

스플래쉬 스크린과 자동로그인을 작업하던 와중에 스플래쉬 스크린에서 행이 걸려서 로그인이 안되는 일이 발생했다.

이 문제는 랜덤하게 발생했는데 찾아보니,

앱이 로드가 되지 않았는데 async function 을 사용하면 행이 걸린다는 것을 알게되었다.

dispatch_group_wait 에서 경고가 발생하며 앱이 로드 되지않고 roop를 타게 되면서 행이 발생한다.

해결방법은 async function 을 React native app 이 로드가 되었는지 확인을 한 후 로드를 했더니 해결되었다.

앱이 로드가 되었는지 확인하는 방법은 다음과 같다.

React native가 마운트 되었을 때 AppState를 사용하여 ApState.currentState 가 ‘active’인 경우 로그인 펑션을 작동 시켰더니 정상적으로 로드가 되었다.

import { createNavigationContainerRef, StackActions } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { useEffect } from 'react';
import { AppState } from 'react-native';
import { login, logout } from './services/Login';
import { getData } from './utils/AsyncService';
import LottieSplashScreen from 'react-native-lottie-splash-screen';

export const RootNavigator = ({children}) => {

....
const loginSuccessCallback = (responseUserInfo) => {
    setTimeout(() => {
      if(responseUserInfo.profileImage == 'undefined'){
        navigate('RegisterUser', {screen:'RegisterUserNickname'});
      }else{
        replace('Home');
      }
      LottieSplashScreen.hide();
    }, 1500);
  };

  ///이메일 로그인 마무리 (애플로그인//구글로그인 회원가입 탈퇴까지)

  const loginErrorCallback = () =>{
    setTimeout(() => {
      logout();
      LottieSplashScreen.hide();
    },1500);
  };

const checkAuth = async () =>{
    const auth = await getData('@auth');
    if (auth != null){
      login(auth, loginSuccessCallback, loginErrorCallback);
      return;
    }
		setTimeout(() => {
      LottieSplashScreen.hide();
    }, 1500);
  };

  useEffect(() => {
    if (AppState.currentState == 'active'){    
      checkAuth();
    }
  }, []);

....

}

지금은 코드가 appState를 참조하지 않고 로그인 기능이 완료 되었을 시점에 로띠스플래시스크린을 종료하는 방식으로 변경, 이유는 로딩 시간이 길어지기 때문.

profile
hello world

0개의 댓글