Swift
SwiftUI - onReceive vs onChange
버그잡이
2023. 6. 10. 18:02
onReceive
- Publisher가 발행될때 이를 탐지할 수 있는 함수
예제 코드
struct ContentView: View {
@State private var message: String = ""
var body: some View {
VStack {
Text(message)
}
.onReceive(timer) { _ in
message = "Timer fired"
}
}
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
}
onChange
- 특정 값이 변경되었을때 이를 탐지할 수 있는 함수
- iOS 14부터 사용 가능
- Equatable을 준수하는 값이면 탐지 가능
- oldValue 캡처 가능
예제 코드
struct PlayerView: View {
var episode: Episode
@State private var playState: PlayState = .paused
var body: some View {
VStack {
Text(episode.title)
Text(episode.showTitle)
PlayButton(playState: $playState)
}
.onChange(of: playState) { [playState] newState in
model.playStateDidChange(from: playState, to: newState)
}
}
}
onReceive vs onChange
공통점
특정 값의 변경을 관찰하고 싶을때 사용
차이점
onReceive
- Publisher 형식의 값
- 같은 값으로 바꿔도 trigger
- oldValue 캡처 지원 X
- iOS 13 부터 사용 가능
onChange
- Equatable을 준수하고 있는 값
- 같은 값으로 바뀌면 trigger 안 됨
- oldValue 캡처 지원 O
- iOS 14 부터 사용 가능
* onChange deprecated
얼마 전까지 deprecated가 아니었던 것 같은데 이번에 iOS17이 나오면서 deprecated 된 것 같다.
action 클로저에서 파라미터를 받지 않거나 파라미터를 2개 받는 방식으로 쓸 것을 권장하고 있다.
변경된 함수는 iOS 17부터 사용 가능하다고 한다.
* 참고
https://developer.apple.com/documentation/swiftui/view/onchange(of:perform:)
반응형