해결된 질문
작성
·
112
·
수정됨
0
40 번 강의에 따라
iOS 18.2
Xcode 16.2
아래 처럼 작성하고 실행 했는데
class ProfileViewModel {
var user: User?
var name: String
var username: String
var bio: String
init() {
let tempUser = AuthManger.shared.currentUser
self.user = tempUser
self.name = tempUser?.name ?? ""
self.username = tempUser?.username ?? ""
self.bio = tempUser?.bio ?? ""
}
프로필 name,bio,username 이 노출이 안됩니다.
ProfileViewModel 의 init() 함수에 로그를 찍어 봤는데
2번 호출이 되고 있습니다.
nil 로 한번 후에 auth 값 들어온후에 한번 실행되는데
이미 ProfileView 가 로드가 되어 있어서 업데이트가
안되는듯 합니다.
-- 확인 부탁드립니다. --
강의소스로 테스트시에도 동일 증상 이었습니다
(9-4ViewModel로 데이터 관리 - 소스로 테스트)
init 에 로그 찍어 봤는데 2번 호출됩니다.
이게 원인인거 같은데요. 첫 초기화에선 Auth값이 nil 이었습니다.
답변 3
1
안녕하세요 랑프님
해당 문제 원인을 찾았습니다.
ContentView파일에
if AuthManager.shared.currentAuthUser == nil {
이렇게 currentAuthUser로 로그인을 판단하던 부분을
if AuthManager.shared.currentUser == nil {
이렇게 바꿔주세요
이게 로그인할 때
currentAuthUser가 세팅되고 그 후에 currentUser가 세팅되는데
그 사이에 profileViewModel이 세팅되어서 빈값들이 화면에 세팅되는거 같습니다.
비슷한 문제를 56강에서 같은 해결법으로 수정하는데요. 그 강의도 참고 부탁드리겠습니다.
xcode 15에서는 발생하지 않았는데 xcode 16에서 나타난 문제 같아요
관련해서 강의 다시 찍어서 업로드 하도록 하겠습니다. 감사합니다!
0
0
안녕하세요, 인프런 AI 인턴입니다.
강의에서 말씀하신 문제는 초기화 지연과 관련된 사항인 것 같습니다. ProfileViewModel
클래스가 두 번 초기화되면서 초기화 시점에 user
데이터를 적절히 받을 수 없고, 따라서 name
, username
, bio
도 표시되지 않는 것 같습니다. 이는 currentUser
가 nil 값인 상태에서 초기화가 먼저 이루어지고, 이후에 정상적인 값이 들어오기 때문일 수 있습니다.
해결 방안으로는 ProfileViewModel
에서 user
데이터를 비동기적으로 받거나, SwiftUI의 @State
, @StateObject
, @ObservedObject
등을 활용하여 데이터 바인딩을 사용하는 것이 좋습니다. 이를 통해 뷰의 상태가 변경될 때마다 UI가 자동으로 업데이트되도록 할 수 있습니다.
기존 질문과 유사한 질문 및 해결 방법에 대한 자료들을 공유합니다:
\@Bindable VS \@Environment + \@Bindable 문제 해결 예시
@Environment
및 @Bindable
사용 시 발생할 수 있는 문제와 어떻게 직접적인 데이터 바인딩을 통해 문제를 해결할 수 있는지를 설명합니다.@State
, @Bindable
사용 시 각각의 역할과 데이터 처리를 어떻게 해야 하는지에 대해 설명하고 있습니다.이러한 접근 방식을 통해 ProfileView
가 업데이트되지 않는 문제를 해소할 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다.
말씀 하신대로 하니 해결 되었습니다.
다만, 로그인창이 떳다가 메인 화면으로 넘어가는
이슈가 있네요. 아무래도 중간에 인트로 화면을
노출 했다 빼주는 로직이 있어야 할듯 합니다.
ㅠ.ㅠ