當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Swift Never onChange(of:perform:)用法及代碼示例


用法一

實例方法

onChange(of:perform:)

添加給定值更改時要執行的操作。

聲明

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

返回值

響應變化而觸發動作的場景。

參數

value

確定是否運行閉包時要檢查的值。該值必須符合 Equatable 協議。

action

值更改時運行的閉包。閉包提供了一個 newValue 參數來指示更改的值。

詳述

使用此修飾符在值更改時觸發副作用,例如與 SwiftUI/Environment 鍵或 SwiftUI/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()
            }
        }
    }
}

係統在主線程上調用action閉包,所以要避免閉包中的long-running任務。如果您需要執行此類任務,請分派到後台隊列:


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

係統將新值傳遞給閉包。如果您需要舊值,請在閉包中捕獲它。

可用版本

iOS 14.0+, iPadOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+

用法二

實例方法

onChange(of:perform:)

為這個視圖添加一個修飾符,當一個特定的值改變時觸發一個動作。

聲明

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

返回值

當指定值更改時觸發操作的視圖。

參數

value

在確定是否運行閉包時要檢查的值。

action

值更改時運行的閉包。

newValue

未通過比較檢查的新值。

詳述

您可以使用 onChange 作為值更改的結果來觸發副作用,例如 Environment 鍵或 Binding

onChange 在主線程上調用。避免在主線程上執行long-running 任務。如果您需要執行 long-running 任務以響應 value 更改,則應分派到後台隊列。

新值被傳遞到閉包中。閉包可以捕獲先前的值,以將其與新值進行比較。例如,在以下代碼示例中,PlayerView 將舊值和新值都傳遞給模型。


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

可用版本

iOS 14.0+, iPadOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Never onChange(of:perform:)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。