CurrentTDDSetup.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import CoreData
  2. import Foundation
  3. extension Home.StateModel {
  4. func setupTDDArray() {
  5. Task {
  6. // Get the NSManagedObjectIDs
  7. async let tddObjectIds = fetchTDD()
  8. let tddIds = await tddObjectIds
  9. // Get the NSManagedObjects and map them to TDD on the Main Thread
  10. await updateTDDArray(with: tddIds, keyPath: \.fetchedTDDs)
  11. }
  12. }
  13. @MainActor private func updateTDDArray(
  14. with IDs: [NSManagedObjectID],
  15. keyPath: ReferenceWritableKeyPath<Home.StateModel, [TDD]>
  16. ) async {
  17. let tddObjects: [TDD] = await CoreDataStack.shared
  18. .getNSManagedObject(with: IDs, context: viewContext)
  19. .compactMap { managedObject in
  20. // Safely extract date and total as optional
  21. let timestamp = managedObject.value(forKey: "date") as? Date
  22. let totalDailyDose = (managedObject.value(forKey: "total") as? NSNumber)?.decimalValue
  23. return TDD(totalDailyDose: totalDailyDose, timestamp: timestamp)
  24. }
  25. self[keyPath: keyPath] = tddObjects
  26. }
  27. // Custom fetch to more efficiently filter only for cob and iob
  28. private func fetchTDD() async -> [NSManagedObjectID] {
  29. let results = await CoreDataStack.shared.fetchEntitiesAsync(
  30. ofType: TDDStored.self,
  31. onContext: tddFetchContext,
  32. predicate: NSPredicate.predicateForOneDayAgo,
  33. key: "date",
  34. ascending: false,
  35. fetchLimit: 1,
  36. propertiesToFetch: ["total", "date", "objectID"]
  37. )
  38. return await tddFetchContext.perform {
  39. guard let fetchedResults = results as? [[String: Any]] else {
  40. return []
  41. }
  42. return fetchedResults.compactMap { $0["objectID"] as? NSManagedObjectID }
  43. }
  44. }
  45. }