버그 잡이

SwiftUI - onReceive vs onChange 본문

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:) 

 

 

반응형
Comments