当当前时间超过阈值时,我该如何使视图更新在SwiftUI中更新?

3
我的应用程序从远程服务器获取模型数据。此模型具有一个带有时代值的字段,根据当前时间是否超过时代,SwiftUI视图应显示不同的视图。
模型类似于以下内容:
struct Order: Decodable {
    var expireAt : Int
    
    func isExpired() -> Bool {
        let epoch = Int(Date().timeIntervalSince1970)
        return expireAt < epoch
    }
}

视图大致如下所示。

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 阈值时,视图会自动更新。
如何最好地实现这一点?我应该使用 Timer 还是 ObservableObject,或者两者都用?例如,使用 ObservableObject 似乎需要将模型的类型从 Struct 更改为 Class,而我不确定这是否符合我的要求。

你需要一个ObservableObject,它可以对该事件做出反应并更新其@Published属性;使你的视图依赖于该属性。如何捕获此事件取决于你特定的应用程序设计。可以是在应用程序启动/恢复时设置的计时器。 - New Dev
1个回答

2
您可以创建一个定时器,例如每秒运行一次,并使用onReceive方法更新您的私有状态,如下所示:
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!")
        }
        
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接