티스토리 뷰

SwiftUI

SwiftUI ) onChange(of:perform:)

Zedd0202 2020. 10. 23. 17:54
반응형

 

안녕하세요 :) Zedd입니다.

오늘은 onChange(of:perform:)에 대해서 공부해보겠습니다!

 

onChange(of:perform:)


특정 값이 "변경" 될 때 action을 실행하고 싶으면 이 onChange(of:perform:)를 사용하면 됩니다.

value : 클로저 실행 여부를 결정할 때 확인 할 값

action : 값이 변경될 때 실행할 클로저

newValue : 비교 검사에 실패한 새 값. 

 

Q : newValue가 어딨어..

A : 이따 나옵니다.

 

- onChange를 사용하여 side-effect를 트리거 할 수 있음.

- onChange는 메인스레드에서 호출됨. -> 메인 스레드에서 긴 작업을 실행하지 말것.

- 값 변경에 대한 응답으로 긴 작업을 실행해야하는 경우 백그라운드 큐로 dispatch해야함.

onReceive글에서 사용한 예제인데요, 이해를 위해 읽고오시면 좋을 것 같습니다..!! 

여기에 onChange를 사용해볼게요.

onReceive와 달리 onChange는 publisher를 받는게 아니라, Equatable을 준수하는 값을 받습니다.

들어간 값이 변하면 onChange가 불리는거에요!!!!

.onChange(of: self.text) { [text] (newText) in
            print(text, newText)
}

text는 oldValue, newText는 newValue라고 생각하시면 됩니다.

 

1. text의 처음 값은 "초기값"이라는 String.

2. 버튼을 누르면 publisher에 값 1 ~ 10사이의 랜덤값 send.

3. publisher에 이벤트가 들어왔으니 onReceive가 불림. 

4. publisher로 부터 받은 값을 text에 할당. 

5. text가 변함

6. onChange가 불림

 

최종적으로 이렇게 되게 됩니다!

text의 old value, new value가 찍히게 되죠.

 

근데 위에서 new value가 비교 검사에 실패한 새 값이라고 했잖아요.

왜 실패했다고 하는지 모르겠어요

원문에는 "The new value that failed the comparison check" 이렇게 적혀있어요!

 

암튼 onChange너무 좋은 것 같네요!!!

반응형