#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
напрямую (вызов при закрытии не является зависимостью), поэтому представление не обновляется.