티스토리 뷰

SwiftUI

SwiftUI) @ObservedObject, @StateObject, @EnvironmentObject 정리

행복하고 싶은 사람 2022. 8. 1. 17:45

이 세 친구들은 모두 비슷한 역할을 하기에 헷갈림을 유발합니다. 그래서 정리해보겠습니다

이 세 친구 모두 @ObservableObject와 함께 쓰이기에 우선 @ObservableObject의 정의를 Apple Developer에서 보면

@ObservableObject

A type of object with a publisher that emits before the object has changed.

-> Object가 변경되기전에 그 사실을 알리는 publisher가 있는 object 타입이다.

@Published는 attribute가 있는데 이 attribute로 선언된 프로퍼티가 변화하면 주위에 그 변화를 알리는 역할을 합니다.

즉 ObservableObject는 Published attribute로 선언된 프로퍼티를 가지고 있는 object 타입이라고 볼 수 있습니다.

이 ObservableObject 프로토콜은 class만 채택할 수 있습니다. ObservableObject는 Publisher를 가지고 있는데

 

struct == 값 타입 즉 값을 복사 그런데 복사된 값을 바꾸는데 여기저기에 알릴필요? XXX

class == 참조타입 값을 바꾸면 원본도 같이 변화! -> 알릴필요 OOO

그래서 class만 채택할수 있다! 이렇게 생각하고 있습니다.

 

@ObservedObject

A property wrapper type that subscribes to an observable object and invalidates a view whenever the observable object changes.

-> 관찰가능한 객체를 구독하고 그 관찰가능한 개체가 변화하면 언제든지 view를 무효화하는 property wrapper 타입이다.

 

관찰가능한 객체를 구독하고 있다가 바뀌면 그 객체가 있는 View를 무효화시키고 새 값을 가진 View로 만드는 녀석입니다.

View를 새로 갈아엎는거죠 그래서 생명주기가 View와 함께합니다.

 

@StateObject

A property wrapper type that instantiates an observable object.
 
-> 관찰가능한 object를 인스턴스화하는 property wrapper type이다. 
 
관찰 가능한 객체를 인스턴스로 만든다는 이야기입니다.
 

Overview를 보면 SwiftUI는 그 객체를 선언하는 구조체의 각 인스턴스에 대해 딱 한번 새 인스턴스를 생성한다. 

관찰 가능한 객체의 의 Published 프로퍼티가 변화하면, SwiftUI는 그 프로퍼티에 의존하는 부분을 업데이트한다.

 

ObservedObject는 View전체를 다시 그리지만 StateObject는 뷰의 일부분만 다시 그린다. 그래서 View와

생명주기가 같지 않게되는겁니다.

 

어 그러면 @ObservedObject를 쓸 필요가 없지 않나?

-> @StateObjet는 인스턴스를 생성하고 @ObservedObject는 인스턴스를 지켜보게 하면 됩니다.

즉 ObservableObject를 처음 생성할 상위 View에서는 @StateObject를 사용해서 ObservableObject를

인스턴스화하고 이 인스턴스를 사용할 하위 View에서는 ObservableObject를 사용하는것을 권장한다고 합니다

 

 

@EnvironmentObject

A property wrapper type for an observable object supplied by a parent or ancestor view.
 
-> parent View 또는 ancestor View 에서 제공하는 관찰 가능한 객체에 대한 propert wrapper type
 

우리가 앱 전역에서 사용하고싶은 data model object가 있는데 위에 두 녀석을 사용한다면 계속해서 인자로 넘겨줘야합니다.

그런데 계속 넘겨주기 싫다? -> object를 environment에 놓아주기 위해 우리는 environmentObject view modifier를사용할 수 있습니다. 최상위 View에서 인스턴스를 만들고 하위 View에 넘겨주면 app어디서든 @EnvironmentObject만 사용하면 인스턴스를 사용할 수 있는것!

 

'SwiftUI' 카테고리의 다른 글

SwiftUI) About TabView  (0) 2022.10.31
SwiftUI) About UIViewRepresentable  (0) 2022.10.27
SwiftUI) @ViewBuilder  (0) 2022.10.07
SwiftUI) About ViewModifier  (0) 2022.09.28
SwiftUI) About ButtonStyle  (0) 2022.08.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함