当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。