StatStateModel.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import CoreData
  2. import Foundation
  3. import SwiftUI
  4. import Swinject
  5. extension Stat {
  6. final class StateModel: BaseStateModel<Provider> {
  7. @Injected() var settings: SettingsManager!
  8. @Published var highLimit: Decimal = 10 / 0.0555
  9. @Published var lowLimit: Decimal = 4 / 0.0555
  10. @Published var overrideUnit: Bool = false
  11. @Published var layingChart: Bool = false
  12. @Published var units: GlucoseUnits = .mmolL
  13. @Published var glucoseFromPersistence: [GlucoseStored] = []
  14. private let context = CoreDataStack.shared.newTaskContext()
  15. private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
  16. override func subscribe() {
  17. setupNotifications()
  18. setupGlucoseArray()
  19. highLimit = settingsManager.settings.high
  20. lowLimit = settingsManager.settings.low
  21. units = settingsManager.settings.units
  22. overrideUnit = settingsManager.settings.overrideHbA1cUnit
  23. layingChart = settingsManager.settings.oneDimensionalGraph
  24. }
  25. private func setupNotifications() {
  26. /// custom notification that is sent when a batch insert of glucose objects is done
  27. Foundation.NotificationCenter.default.addObserver(
  28. self,
  29. selector: #selector(handleBatchInsert),
  30. name: .didPerformBatchInsert,
  31. object: nil
  32. )
  33. }
  34. @objc private func handleBatchInsert() {
  35. setupGlucoseArray()
  36. }
  37. private func setupGlucoseArray() {
  38. Task {
  39. let ids = await self.fetchGlucose()
  40. await updateGlucoseArray(with: ids)
  41. }
  42. }
  43. private func fetchGlucose() async -> [NSManagedObjectID] {
  44. CoreDataStack.shared.fetchEntities(
  45. ofType: GlucoseStored.self,
  46. onContext: context,
  47. predicate: NSPredicate.glucose,
  48. key: "date",
  49. ascending: false,
  50. fetchLimit: 288
  51. ).map(\.objectID)
  52. }
  53. @MainActor private func updateGlucoseArray(with IDs: [NSManagedObjectID]) {
  54. do {
  55. let glucoseObjects = try IDs.compactMap { id in
  56. try viewContext.existingObject(with: id) as? GlucoseStored
  57. }
  58. glucoseFromPersistence = glucoseObjects
  59. } catch {
  60. debugPrint(
  61. "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error.localizedDescription)"
  62. )
  63. }
  64. }
  65. }
  66. }