- Total
꿈꾸는리버리
onAppear vs onRecieve 본문
Input & Event Modifiers에는 많은 녀석들이 있지만, 오늘은 onAppear vs onRecieve 이 두녀석을 비교해 보고자 한다.
1) onchange
onchange 이 녀석은 View Life Cycle에 속해 있는 아이이다.
정의를 살펴보자면,,
@inlinable public func onChange<V>(of value: V, perform action: @escaping (_ newValue: V) -> Void) -> some View where V : Equatable
어떤 값이 변했을 때 action을 취하도록 하는 modifier이다.
너무 긴 running time의 action이 필요하다면 background queue를 dispatch 해야 한다.
( 이 부분은 나중에 더 공부해서 수정을 해야 겠당.. 아마 DispatchQueue 관련 내용일 듯 ..? )
사용은 이런식으로 하면 된다. ( name 은 @State property이다. )
.onChange(of : name){ [name] newValue in
print(newValue)
print(name)
}
newValue는 바뀐 값이고, 이전의 값을 알고 싶다면 [ ]으로 값을 넣어두면 사용할 수 있다.
+) @State가 아닌 일반 상수나 변수로 하면 값이 변하더라도 struct이 redrawn되지 않기 때문에 onChange가 무효해지게 된다..!
2) OnRecieve
onRecieve 이 녀석은 Publisher Events에 속해 있는 아이이다.
정의를 살펴보자면,,
@inlinable public func onReceive<P>(_ publisher: P, perform action: @escaping (P.Output) -> Void) -> some View where P : Publisher, P.Failure == Never
Publisher가 내보낸 data를 감지할 때 action을 취하도록 하는 modifier이다.
.onReceive(viewModel.$name){ _ in
print(changeCount)
}
근데 이렇게 코드를 작성하고 나서 궁금증이 하나 생겼다.
둘이 뭔 차이지?
1) onReceive - 아래와 같이 @State로 선언된 name을 넣으려 하면 오류가 발생한다.
onReceive의 파라매터에는 "@ObservedObject, @StateObject, @EnvironmentObject" 등의 @Publisher와 관련된 값이 들어가야 한다. ( Combine 개념을 아직 잘 몰라서 이정도로 알고 넘어가기로 했다... 후에 제대로 공부를 해보겠어효... )
2) onReceive - $ 표시 필수 (publisher이기 때문에)
3) onChange는 "값이 변할 때 마다" vs onReceive는 "publisher 값이 접근될 때마다"
onReceive와 달리 onChange는 publisher를 받는게 아니라, Equatable을 준수하는 값을 받는다.
그래서 onChange는 뷰가 처음 열렸을 때는 action이 일어나지 않고,
onRecieve는 뷰가 처음 열렸을 때도 action이 일어난다고 한다 !
아래 실험을 보면, Onchange는 이전과 현재의 값이 변할 때만, OnReceive는 접근을 해서 값을 만졌을 경우에 publish 될 때 마다 호출이 된다.
그래서 3->3으로 값을 넣을 때는 OnReceive만,
3->4로 값을 넣을 때는 Onchange와 OnReceive가 모두 출력이 된다.
'오뚝이 개발자 > SwiftUI' 카테고리의 다른 글
SwiftUI : Custom Color (0) | 2022.05.24 |
---|---|
SwiftUI : dark mode preview (0) | 2022.05.24 |
@EnvironmentObject ???? (0) | 2022.05.01 |
AppStorage (1) | 2022.04.29 |
@StateObject vs @ObservedObject (2) | 2022.04.28 |