๊ณต์๋ฌธ์ : Performs an action when a specified value changes.
func onChange<V>(
of value: V,
perform action: @escaping (V) -> Void
) -> some View where V : Equatable
- ํด๋ก์ ์ ์คํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋ ํ์ธํ ๊ฐ.
- value๋ Equatable ํ๋กํ ์ฝ์ ์ค์ํด์ผํ๋ค.
- ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์คํํ ํด๋ก์ ์ด๋ค.
- ํด๋ก์ ๋ ์ ๋ฐ์ดํธ๋ ๊ฐ์ ๋ํ๋ด๋ newValue ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ์ฉ๋๋ค.
์ง์ ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ action์ ์คํํ ๋ทฐ๋ฅผ ๋ฐํํ๋ค.
onChange()๋ Environment๊ฐ์ด๋ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์คํํ ํด๋ก์ ์ด๋ค.
ex) ๋ทฐ๊ฐ background๋ก ์ด๋ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ ์บ์๋ฅผ ์ง์ฐ๋ ์ฝ๋
struct ContentView: View {
@Environment(\.scenePhase) private var scenePhase
@StateObject private var cache = DataCache()
var body: some View {
MyView()
.onChange(of: scenePhase) { newScenePhase in
if newScenePhase == .background {
cache.empty()
}
}
}
}
onChange()์์ SwiftUI๋ ์ ๊ฐ์ ํด๋ก์ ์ ์ ๋ฌํ๋ฉฐ, ์ด์ ๊ฐ์ ์บก์ณํ์ฌ ์ ๊ฐ๊ณผ ๋น๊ต๋ ํ ์ ์๋ค.
ex) Player View๊ฐ ์ด์ ๊ฐ๊ณผ ์ ๊ฐ ๋ชจ๋ ๋ชจ๋ธ์๊ฒ ์ ๋ฌํ๋ ์ฝ๋์ด๋ค.
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)
}
}
}
์ ์ฝ๋์์ playState๋ oldValue, newState๋ newValue๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
-
ํ์์ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
-
onChange๋ ๋ฉ์ธ ์ค๋ ๋์์ ํธ์ถ๋๋ค. -> ๋ฉ์ธ ์ค๋ ๋์์ ๊ธด ์์ ์ ์คํ ๊ธ์ง.( ex. ์๋ฒ์์ ํต์ )
-
๊ฐ ๋ณ๊ฒฝ์ ๋ํ ์๋ต์ผ๋ก ๊ธด ์์ ์ ์คํํด์ผํ๋ ๊ฒฝ์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก Dispatchํด์ผํ๋ค.
-
์ด์ ๊ฐ์ ์บก์ณํ๋ค.