Ios SwiftUI@FetchRequest在应用程序重新启动之前不会更新视图
我在ToDo应用程序中有两个视图,一个视图允许用户添加新的ToDo并将其标记为已完成,另一个视图显示日历,允许用户查看任何给定日期可能已完成的所有ToDo。Ios SwiftUI@FetchRequest在应用程序重新启动之前不会更新视图,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我在ToDo应用程序中有两个视图,一个视图允许用户添加新的ToDo并将其标记为已完成,另一个视图显示日历,允许用户查看任何给定日期可能已完成的所有ToDo。ToDo实体和DayOfYear实体之间存在多对一关系。当用户点击ToDo Complete按钮时,我更新核心数据中ToDo下的completedDay关系。当我立即切换到日历视图时,FetchRequest不包含任何内容,即使我在更新关系后立即保存更新的上下文。但当我重新启动应用程序时,日历视图会正确显示已完成的待办事项 do {
ToDo
实体和DayOfYear
实体之间存在多对一关系。当用户点击ToDo Complete按钮时,我更新核心数据中ToDo下的completedDay
关系。当我立即切换到日历视图时,FetchRequest
不包含任何内容,即使我在更新关系后立即保存更新的上下文。但当我重新启动应用程序时,日历视图会正确显示已完成的待办事项
do {
let today = DayOfYear.withDate(convertStringToDate(day), context: context)
todo.completedDay_ = today
try self.context.save()
} catch {
print("Error saving managed object context: \(error)")
}
年度延长日
extension DayOfYear {
static func withDate(_ day: Date, context: NSManagedObjectContext) -> DayOfYear {
let request = fetchRequest(NSPredicate(format: "date = %@", day as CVarArg))
let days = (try? context.fetch(request)) ?? []
if let day = days.first {
return day
} else {
let newDay = DayOfYear(context: context)
newDay.date = day
return newDay
}
}
}
在日历视图中获取请求
@FetchRequest(entity: DayOfYear.entity(), sortDescriptors: [], predicate: NSPredicate(format: "date >= %@ AND date <= %@", Date().startOfMonth() as CVarArg, Date() as CVarArg)) var daysOfYear: FetchedResults<DayOfYear>
FetchRequest
是否应该在核心数据发生变化时更新自身并显示更新后的结果,还是在关系以某种方式更新时不会立即更新?简短回答:否;时间更长——不总是这样。在您的情况下,示例文本视图正文似乎不直接依赖于daysOfYear
(调用结束不是依赖项),因此视图不会更新;时间更长——不总是这样。在您的例子中,示例文本视图主体似乎不直接依赖于daysOfYear
(调用闭包不是依赖项),因此视图不会更新。
Text("Completed ToDos").font(.title)
.onAppear {
print(self.daysOfYear)
// prints empty until I restart the app
}