1. 문제 발생 현상

 

보라색 경고 발생, 앱 빌드는 되지만 앱이 실행되는 동안 계속 발생하며 경고 문구 count가 계속 증가합니다.

 

Accessing StateObject's object without being installed on a View. This will create a new instance each time.

 

struct HomeMyWallet: View {
    @StateObject var studentAccountM: StudentAccountVM
    @StateObject var studentChangeM: StudentChangeVM
    
    init(api_url: String, studentIdStored: Int, studentAccountM: StudentAccountVM, studentChangeM: StudentChangeVM) {
        self._studentAccountM = StateObject(wrappedValue: studentAccountM)
        self._studentChangeM = StateObject(wrappedValue: studentChangeM)
        self.loadStudentAccountData()
    }
    
    func loadStudentAccountData() {
        studentAccountM.getData(completion: {data in
            DispatchQueue.main.async {
                self.studentAccountM.studentAccount = data
            }
        })
    }
    
    var body: some View {
        ...
    }
}

 

 

 

 

 

2. 문제 원인

 

 이 오류는 StateObject가 뷰에 설치되지 않은 상태에서 해당 객체에 접근하려고 시도할 때 발생합니다. StateObject는 SwiftUI의 뷰 수명주기에 따라 생성되므로, 뷰가 화면에 나타나기 전에 StateObject의 인스턴스에 접근하면 새로운 인스턴스가 매번 생성되기 때문에 발생합니다.

 

 

 

 

 

3. 해결 방법

 

 필자의 경우 StateObject를 꼭 사용해야하는 상황이 아니었기에 ObservedObject로 변경해주었습니다.

 

struct HomeMyWallet: View {
    @ObservedObject var studentAccountM: StudentAccountVM
    @ObservedObject var studentChangeM: StudentChangeVM
    
    init(api_url: String, studentIdStored: Int, studentAccountM: StudentAccountVM, studentChangeM: StudentChangeVM) {
        self.studentAccountM = studentAccountM
        self.studentChangeM = studentChangeM
        self.loadStudentAccountData()
    }
    
    func loadStudentAccountData() {
        studentAccountM.getData(completion: {data in
            DispatchQueue.main.async {
                self.studentAccountM.studentAccount = data
            }
        })
    }
    
    var body: some View {
        ...
    }
}

 

 

 

 

 

+ Recent posts