SwiftUI 的 .onReceive 修饰符捕获定时器发布的事件

4 min read

SwiftUI 的 .onReceive 修饰符用于捕获由某个 Publisher 发布的事件,并以此触发一些操作。其中,定时器 Timer 也是一个 Publisher,它会定时发布事件,因此可以被 .onReceive 捕获。

以下是一个例子,每隔一秒钟打印一次当前时间:

struct ContentView: View {
    @State private var currentTime = Date()

    var body: some View {
        Text(currentTime.description)
            .onReceive(Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()) { _ in
                currentTime = Date()
            }
    }
}

在这个例子中,我们使用 Timer.publish 创建了一个每秒钟发布事件的定时器,然后使用 .autoconnect() 方法让它自动连接到当前 RunLoop,这样它才能顺利地工作。最后,我们使用 .onReceive 捕获了每次定时器事件的发生,并在处理函数中更新了显示时间的状态变量 currentTime。