Instance Method インスタンスメソッド

onChange(of:perform:)

Adds an action to perform when the given value changes. 与えられた値が変化する時に実行するアクションを加えます。

Declaration 宣言

func onChange<V>(of value: V, perform action: @escaping (V) -> Void) -> some Scene where V : Equatable

Return Value 戻り値

A scene that triggers an action in response to a change. あるシーン、それはあるアクションをある変化に答えて引き起こします。

Parameters パラメータ

value

The value to check when determining whether to run the closure. The value must conform to the Equatable protocol. クロージャを走らせるかどうかを決定する時に検査する値。値は、Equatableプロトコルに準拠しなければなりません。

action

A closure to run when the value changes. The closure provides a single newValue parameter that indicates the changed value. 値が変化する時に実行することになるクロージャ。クロージャは、単一のnewValueパラメータを提供します、それは変更された値を指し示します。

Discussion 議論

Use this modifier to trigger a side effect when a value changes, like the value associated with an Environment key or a Binding. For example, you can clear a cache when you notice that a scene moves to the background: この修飾子を使って、ある値が変化する時にある副作用を引き起こしてください、EnvironmentキーやBindingと結び付けられた値のような。例えば、あなたはあるキャッシュを、あなたがあるシーンがバックグラウンドに移動することに気づく時にクリアできます:


struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    @StateObject private var cache = DataCache()


    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
        .onChange(of: scenePhase) { newScenePhase in
            if newScenePhase == .background {
                cache.empty()
            }
        }
    }
}

The system calls the action closure on the main thread, so avoid long-running tasks in the closure. If you need to perform such tasks, dispatch to a background queue: システムは、actionクロージャをメインスレッド上で呼び出します、なのでクロージャの中で長く動作するタスクを避けてください。あなたがそのようなタスクを実行する必要があるならば、あるバックグラウンドキューにディスパッチしてください:


.onChange(of: scenePhase) { newScenePhase in
    if newScenePhase == .background {
        DispatchQueue.global(qos: .background).async {
            // ...
        }
    }
}

The system passes the new value into the closure. If you need the old value, capture it in the closure. システムは、新しい値をクロージャへと渡します。あなたが古い値を必要とするならば、それをクロージャの中でキャプチャしてください。

See Also 参照

Watching for Changes