본문 바로가기
UIKit

Firebase currentUser 에러 해결방법 in iOS Swift

by IYEA 2023. 8. 10.

 

https://firebase.google.com/docs/auth/ios/manage-users?hl=ko#swift_1

 

Firebase에서 사용자 관리하기  |  Firebase Authentication

Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 Firebase에서 사용자 관리하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요

firebase.google.com

 

공식문서에 따르면 사용자의 정보를 불러오는 방식에는 2가지가 있다.

if Auth.auth().currentUser != nil {
  // User is signed in.
  // ...
} else {
  // No user is signed in.
  // ...
}
Auth.auth().addStateDidChangeListener { auth, user in
  
}

 

첫번째 방식으로 진행했을 때 왜 오류가 생기는지 알아보자.

작업 중인 스레드에서 Auth.auth().currentUser를 호출했는데 메인 스레드에서 user의 정보를 불러오는 작업까지 해버린다면,

user의 정보를 불러오는 동안 다른 작업을 할 수 없다는 비효율성이 생긴다.

때문에 다른 스레드에 해당 작업을 넘기고 user 정보를 받지 않았는데도 비교를 시작할 가능성이 있다.

 

 

하지만 지금과 같은 경우에는 user의 정보를 모두 불러오는 작업이 끝난 후 다음 작업들을 시작해야한다.

때문에 completionHandler를 가진 함수, 즉 아까 정보를 불러오는 두번째 방법을 통해서 작업한다면 오류를 해결할 수 있다.

 

참고: 인증 객체의 초기화가 완료되지 않아 currentUser가 null일 수도 있습니다. 리스너를 사용해 사용자의 로그인 상태를 추적하면 이런 상황을 처리할 필요가 없습니다.

공식문서에서도 해결 방법을 알려주고 있다.

 

하지만 첫번째 방법을 고집하는 방법도 있는데,

1
2
3
4
5
if Auth.auth().currentUser == nil {
    DispatchQueue.main.async {
        // task
    }
}
cs

메인스레드에 비동기적으로 작업을 넘겨줌으로써, 약간의 딜레이를 발생시켜 그 사이에 유저의 정보를 불러오게하는 방법도 있는것같으나..

굳이??

 

틀린내용 있으면 지적해주세요