SwiftUI @fetchRequest не обновляет представление до перезапуска приложения

#ios #swift #xcode #swiftui

#iOS #swift #xcode #swiftui

Вопрос:

У меня есть 2 представления в приложении ToDo, одно представление позволяет пользователю добавлять новые задачи и отмечать их как завершенные, а другое показывает календарь, который позволяет пользователю видеть все задачи, которые он мог бы выполнить в любой данный день. Между ToDo объектом и DayOfYear сущностью существует отношение «многие к одному». Когда пользователь нажимает на кнопку Завершения задачи, я обновляю completedDay_ взаимосвязь в разделе ToDo в Core Data. Когда я сразу переключаюсь на просмотр календаря, 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>
  

Примерный текстовый вид только для получения консольной печати

 Text("Completed ToDos").font(.title)
    .onAppear {
        print(self.daysOfYear)
        // prints empty until I restart the app
    }
  

Не FetchRequest предполагается ли обновлять себя и показывать обновленные результаты из Core Data всякий раз, когда они изменяются, или они не обновляются немедленно, когда отношения каким-либо образом обновляются?

Комментарии:

1. Короткий ответ: нет; дольше — не всегда. В вашем случае кажется, что текстовое представление образца не зависит от daysOfYear напрямую (вызов при закрытии не является зависимостью), поэтому представление не обновляется.