본문 바로가기

차장님의 이야기

SwiftUI에서 MvvM에서 실수 할 수 있는 것 중 1개

SwiftUI에서 개발을 하다가 View를 최대한 프리미티브, 최소 단위로 만든 뒤 개발을 해야 한다고 배웠었다.

 

그래서 NavigationBarItem에서 Leading이나 Trailling에서도 HStack { ~~ }으로 나눠지니 분리 해서 개발을 하고,

이벤트 처리 할 수 있도록 만들고 하다 보니까

 

심각한 문제가 발생했던 것이다.!

위의 사진 처럼

ContentView에 MyButton이 있는 형식이다.

여기서 문제점이

MyButton에서 touch 이벤트 (onTouch)가 발생 했을 때 나오게 된다.

 

이유는 ContentViewModel에 있는 p변수는 대입이 될 때 ContentView의 인스턴스를 다시 만들기 때문이다.

일단 다시 만드는 형식이다.

 

ObservedObject는 인스턴스가 할당이 될 때 재 할당을 하게 된다

즉 ContentViewModel에 있는 어떤 변수가 대입이 발생한다 ->

ContentView를 다시 그린다 ->

MyButton 인스턴스를 다시 만든다.

MyButtonViewModel을 다시 만든다

MyButtonViewModel에 있는 p의 값이 초기화가 된다.

 

즉 ContentViewModel의 값이 바뀌게 된다면 하위에 있는 모든 ObservedObject의 값이 초기화가 된다란 의미가 된다..

해결 방법은
1. 모든 값을 상위의 뷰에서 관찰을 한다. (Binding)

2. 조금 무리 이긴 하겠지만 EnviromentObject를 이용한다

3. IOS 14이후에 나오는 인스턴스 대입에 초기화 하는것이 아닌 View를 다시 그릴때 초기화가 되는 StateObject를 이용한다.

 

==

아이폰 12랑 IOS14가 같이 나올테니 1달이나 2달만 더 기다리자... 정식으로 출시가 된다면 그때 써먹을 수 있을것이다..