我有一个 SwiftData @Query,它为我提供了一个 Event 对象数组。由于对象的性质(例如动态距离计算),我使用函数手动过滤事件。
这对于对象中的任何更改都有效,并且它们直接显示在 SwiftUI 列表中。但是如果我添加一个对象,列表不会更新(因为它是从过滤列表创建的,而不是直接从 @Quary 创建的)。
有没有办法订阅 @Quary 以获取通知(或传递状态)以便刷新数据?这是相关代码,数据变量包含按天排序并使用常规函数过滤的数据。FilterManager 是一个可观察对象,它会在过滤器参数发生变化时发出通知。
@State var data: [Date:[Event]] = [:]
@Query(sort: \Event.startTime) private var events: [Event]
List {
ForEach(Array(data.keys).sorted(by: <), id: \.self) { day in
Section(header: Text(day,format: Date.FormatStyle()
.year(.defaultDigits)
.month(.abbreviated)
.day(.twoDigits)
.weekday(.abbreviated)).font(.footnote)) {
ForEach(data[day]!) { item in
[...]
}
}
}.onAppear(){
data = filterManager.sortedEvents(events: filterManager.filteredEvents(events: events))
}.onReceive(filterManager.objectWillChange){
data = filterManager.sortedEvents(events: filterManager.filteredEvents(events: events))
}
使用计算属性(取决于
events
),例如而不是
假设您添加了
Event
触发查询刷新的对象,您应该能够观察到它: