#swift #date #core-data #swiftui #nspredicate
#swift #Дата #core-data #swiftui #nspredicate
Вопрос:
У меня есть данные, сохраненные в виде блюд; Завтрак, обед, ужин и закуски. Я пытаюсь вернуть общее количество калорий от всех приемов пищи за каждый день за предыдущую неделю.
Данные о приеме пищи сохраняются, как показано ниже, с помощью .Дата :
func saveBreakfast() {
let newBreakfastItem = BreakfastItem(context: self.moc)
newBreakfastItem.id = UUID()
newBreakfastItem.name = self.item.name
newBreakfastItem.calories = Int32(self.totalCalories)
newBreakfastItem.carbs = Int32(self.totalCarbs)
newBreakfastItem.protein = Int32(self.totalProtein)
newBreakfastItem.fat = Int32(self.totalFats)
newBreakfastItem.date = self.dateAdded
do {
if self.mocB.hasChanges { // saves only if changes are made
try? self.mocB.save()
}
}
}
func saveLunch() {
let newLunchItem = LunchItem(context: self.moc)
newLunchItem.id = UUID()
newLunchItem.name = self.item.name
newLunchItem.calories = Int32(self.caloriesPerServing)
newLunchItem.carbs = Int32(self.carbsPerServing)
newLunchItem.protein = Int32(self.proteinPerServing)
newLunchItem.fat = Int32(self.fatsPerServing)
newLunchItem.date = self.dateAdded
do {
if self.mocL.hasChanges {
try? self.mocL.save()
}
}
}
В настоящее время я работаю с приведенной ниже функцией, чтобы попытаться заставить ее работать в течение одного дня (Date() — 1 день, то есть вчера)
func dayOneCal(at date: Date) -> NSNumber {
let request1:NSFetchRequest<BreakfastItem> = BreakfastItem.fetchRequest() as! NSFetchRequest<BreakfastItem>
let request2:NSFetchRequest<LunchItem> = LunchItem.fetchRequest() as! NSFetchRequest<LunchItem>
let request3:NSFetchRequest<DinnerItem> = DinnerItem.fetchRequest() as! NSFetchRequest<DinnerItem>
let request4:NSFetchRequest<SnackItem> = SnackItem.fetchRequest() as! NSFetchRequest<SnackItem>
let startDate = Calendar.current.startOfDay(for: date)
var components = DateComponents()
components.day = -1
components.second = -1
let endDate = Calendar.current.date(byAdding: components, to: startDate)!
request1.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)
request2.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)
request3.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)
request4.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)
let totalDailyBreakfastCals = BreakfastItems.map({$0.calories}).reduce(0, )
let totalDailyLunchCals = LunchItems.map({$0.calories}).reduce(0, )
let totalDailyDinnerCals = DinnerItems.map({$0.calories}).reduce(0, )
let totalDailySnacksCals = SnackItems.map({$0.calories}).reduce(0, )
let totalDailyCals = totalDailyBreakfastCals totalDailyLunchCals totalDailyDinnerCals totalDailySnacksCals
return totalDailyCals as NSNumber
}
Любая помощь была бы с благодарностью принята, заранее благодарю!
Комментарии:
1. Что работает, что не работает? Неясно, где именно вы боретесь.
2. Возможно, вам не следует добавлять -1 к начальной дате при вычислении конечной даты, если вы не хотите, чтобы конечная дата была после начальной даты, то есть 😉
3. Вы показали код для сохранения ваших объектов, и вы определили свои
NSFetchRequest
ы. Вы действительно выполняете эти запросы противNSManagedObjectContext
?