티스토리 뷰

Why ?


TabBar를 구현하는데 탭 이동을 하고나서 VIewModel이 초기화 되는 것 같았다.

뭐가 문제인지 알아보던 중 해결방법을 찾긴했지만 더 알아보고 정리해야 할 것 같아서 정리한다.

ObservedObject ?


@ObservedObject를 사용하여 ViewModel의 변화를 관찰, 반응할 수 있다.

Publisher가 보내주는 신호에 따라 변경되면 View를 만료시키고 새로 그린다.

상위 State변수가 변화하면 해당 변수를 사용하고있는 하위 View들은 모두 초기화 된다.

  • 이런 현상으로 인해 탭 이동을 하고나면 ViewModel이 초기화 되는 느낌을 받았다.
  • 탭 이동 할 때 마다 init() 이 호출되는 것으로 보아 확실하다..

StateObject ?


iOS 14부터 StateObject가 등장했다.

애플문서에 ObservableObject를 객체화 한다고 설명이 나와있다.

StateObject는 ObservedObject와 거의 똑같으나, 이 StateObject는 하나의 객체로 만들어지고, View가 얼마나 초기화 되든지 상관없이 별개의 객체로 관리된다.

StateObject로 변경하고 난 뒤 init() 에 로그를 남겨보니 초기화가 한번만 되는 것을 알 수 있었다.

애플에서 추천하는 사용법


처음 초기화 할 때는 StateObject를 사용하고, 이미 객체화 된것을 넘겨받을 때 (하위 View)는 ObservedObject 사용을 추천한다.

struct MainView: View {
	// 처음 초기화
	@StateObject private var viewModel = MainViewModel()

	var body: some View {
		LowerView(viewModel: viewModel)
	}
}

// 하위 View
struct LowerView: View {
	@ObservedObject var viewModel: MainViewModel

	var body: some View {
		Text("Hello world")
	}
}

위와 같은 형태로 작업했다.

🤔


생각지도 못한 부분에서 삽질을 하느냐고 하루를 썼다.

State, Binding, StateObject, ObservedObject, ObservableObject 등 다양한 요소가 있는데 자세히 뜯어보지 않고 필요할 때 슬쩍 보고 사용하다보니 이런 상황에 만들어 진 것 같다.

하루 삽질하고 이런 정보를 얻게 됐으니 이득이라고 생각한다.

Reference


 

Apple Developer Documentation

 

developer.apple.com

 

'iOS > SwiftUI' 카테고리의 다른 글

[SwiftUI] Carousel Card View  (0) 2022.08.01
[SwiftUI] 코드로 네비게이션 실행하기  (0) 2022.07.20
[SwiftUI] 애플 로그인  (0) 2022.06.15
[SwiftUI] 카카오 로그인  (0) 2022.06.15
[SwiftUI] Splash  (0) 2022.06.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함