gpt4 book ai didi

swiftui - 当当前时间超过 SwiftUI 中的阈值时,如何使 View 更新?

转载 作者:行者123 更新时间:2023-12-05 04:55:48 25 4
gpt4 key购买 nike

我的应用从远程服务器获取模型数据。该模型有一个具有纪元值的字段,SwiftUI View 应根据当前时间是否超过纪元显示不同的 View 。

模型如下所示。

struct Order: Decodable {
var expireAt : Int

func isExpired() -> Bool {
let epoch = Int(Date().timeIntervalSince1970)
return expireAt < epoch
}
}

View 如下所示。

struct OrderView: View {
@EnvironmentObject var rs : RemoteService
var body: some View {
if rs.hasOrder() {
NavigationView {
VStack {
if rs.Order != nil && rs.Order!.isExpired() {
Text("Your order has expired")
} else {
Text("Your order has not expired.")
}
}
}
} else {
Text("You don't have order yet!")
}

}
}

我想要实现的是,只要当前纪元时间超过模型的 expireAt 阈值, View 就会自动更新。

实现该目标的最佳方法是什么?我应该使用 Timer 还是 ObservableObject,或者两者都用?例如,使用 ObservableObject 似乎需要为模型使用 Class 而不是 Struct ,我不确定这是否是我想要的实现。

最佳答案

例如,您可以创建一个每 1 秒运行一次的计时器,并使用 onReceive 方法更新您的私有(private)状态,如下所示:

class AppConfig: ObservableObject {
@Published var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
}

struct OrderView: View {
@EnvironmentObject var rs : RemoteService
@EnvironmentObject var appConfig : AppConfig

@State private var showExpiredText: Bool = false

var body: some View {
if rs.hasOrder() {
NavigationView {
VStack {
if showExpiredText {
Text("Your order has expired")
} else {
Text("Your order has not expired.")
}
}
}
.onReceive(appConfig.timer) { _ in
if rs.Order != nil && rs.Order!.isExpired() {
showExpiredText = true
} else {
showExpiredText = false
}
}

} else {
Text("You don't have order yet!")
}

}
}

关于swiftui - 当当前时间超过 SwiftUI 中的阈值时,如何使 View 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65171201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com