반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

onAppear vs onRecieve 본문

오뚝이 개발자/SwiftUI

onAppear vs onRecieve

rriver2 2022. 5. 1. 15:58
반응형

 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이 일어난다고 한다 !

출처 :&nbsp;https://stackoverflow.com/questions/64392029/combine-onchange-and-onappear-events-in-swiftui-view

 

아래 실험을 보면, 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
Comments