polscm32 1 год назад
Родитель
Сommit
5ce4ef66fd

+ 52 - 0
FreeAPS/Sources/Modules/Stat/StatStateModel.swift

@@ -1,3 +1,4 @@
+import CoreData
 import Foundation
 import SwiftUI
 import Swinject
@@ -10,13 +11,64 @@ extension Stat {
         @Published var overrideUnit: Bool = false
         @Published var layingChart: Bool = false
         @Published var units: GlucoseUnits = .mmolL
+        @Published var glucoseFromPersistence: [GlucoseStored] = []
+
+        private let context = CoreDataStack.shared.newTaskContext()
+        private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
 
         override func subscribe() {
+            setupNotifications()
+            setupGlucoseArray()
             highLimit = settingsManager.settings.high
             lowLimit = settingsManager.settings.low
             units = settingsManager.settings.units
             overrideUnit = settingsManager.settings.overrideHbA1cUnit
             layingChart = settingsManager.settings.oneDimensionalGraph
         }
+
+        private func setupNotifications() {
+            /// custom notification that is sent when a batch insert of glucose objects is done
+            Foundation.NotificationCenter.default.addObserver(
+                self,
+                selector: #selector(handleBatchInsert),
+                name: .didPerformBatchInsert,
+                object: nil
+            )
+        }
+
+        @objc private func handleBatchInsert() {
+            setupGlucoseArray()
+        }
+
+        private func setupGlucoseArray() {
+            Task {
+                let ids = await self.fetchGlucose()
+                await updateGlucoseArray(with: ids)
+            }
+        }
+
+        private func fetchGlucose() async -> [NSManagedObjectID] {
+            CoreDataStack.shared.fetchEntities(
+                ofType: GlucoseStored.self,
+                onContext: context,
+                predicate: NSPredicate.glucose,
+                key: "date",
+                ascending: false,
+                fetchLimit: 288
+            ).map(\.objectID)
+        }
+
+        @MainActor private func updateGlucoseArray(with IDs: [NSManagedObjectID]) {
+            do {
+                let glucoseObjects = try IDs.compactMap { id in
+                    try viewContext.existingObject(with: id) as? GlucoseStored
+                }
+                glucoseFromPersistence = glucoseObjects
+            } catch {
+                debugPrint(
+                    "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error.localizedDescription)"
+                )
+            }
+        }
     }
 }

+ 12 - 13
FreeAPS/Sources/Modules/Stat/View/ChartsView.swift

@@ -4,14 +4,14 @@ import SwiftDate
 import SwiftUI
 
 struct ChartsView: View {
-    @FetchRequest var glucose: FetchedResults<GlucoseStored>
-
     @Binding var highLimit: Decimal
     @Binding var lowLimit: Decimal
     @Binding var units: GlucoseUnits
     @Binding var overrideUnit: Bool
     @Binding var standing: Bool
 
+    var glucose: [GlucoseStored]
+
     @State var headline: Color = .secondary
 
     private let conversionFactor = 0.0555
@@ -34,21 +34,20 @@ struct ChartsView: View {
     }
 
     init(
-        filter: NSDate,
+        filter _: NSDate,
         _ highLimit: Binding<Decimal>,
         _ lowLimit: Binding<Decimal>,
         _ units: Binding<GlucoseUnits>,
         _ overrideUnit: Binding<Bool>,
-        _ standing: Binding<Bool>
-    ) { _glucose = FetchRequest<GlucoseStored>(
-        sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)],
-        predicate: NSPredicate(format: "glucose > 0 AND date > %@", filter)
-    )
-    _highLimit = highLimit
-    _lowLimit = lowLimit
-    _units = units
-    _overrideUnit = overrideUnit
-    _standing = standing
+        _ standing: Binding<Bool>,
+        glucose: [GlucoseStored]
+    ) {
+        _highLimit = highLimit
+        _lowLimit = lowLimit
+        _units = units
+        _overrideUnit = overrideUnit
+        _standing = standing
+        self.glucose = glucose
     }
 
     var glucoseChart: some View {

+ 10 - 5
FreeAPS/Sources/Modules/Stat/View/StatRootView.swift

@@ -113,7 +113,8 @@ extension Stat {
                     $state.lowLimit,
                     $state.units,
                     $state.overrideUnit,
-                    $state.layingChart
+                    $state.layingChart,
+                    glucose: state.glucoseFromPersistence
                 )
             case .Day:
                 ChartsView(
@@ -122,7 +123,8 @@ extension Stat {
                     $state.lowLimit,
                     $state.units,
                     $state.overrideUnit,
-                    $state.layingChart
+                    $state.layingChart,
+                    glucose: state.glucoseFromPersistence
                 )
             case .Week:
                 ChartsView(
@@ -131,7 +133,8 @@ extension Stat {
                     $state.lowLimit,
                     $state.units,
                     $state.overrideUnit,
-                    $state.layingChart
+                    $state.layingChart,
+                    glucose: state.glucoseFromPersistence
                 )
             case .Month:
                 ChartsView(
@@ -140,7 +143,8 @@ extension Stat {
                     $state.lowLimit,
                     $state.units,
                     $state.overrideUnit,
-                    $state.layingChart
+                    $state.layingChart,
+                    glucose: state.glucoseFromPersistence
                 )
             case .Total:
                 ChartsView(
@@ -149,7 +153,8 @@ extension Stat {
                     $state.lowLimit,
                     $state.units,
                     $state.overrideUnit,
-                    $state.layingChart
+                    $state.layingChart,
+                    glucose: state.glucoseFromPersistence
                 )
             }
         }