Просмотр исходного кода

Remove need for sorting glucose array on the Main Thread, use only latest two Glucose Values (manual/non-manual) for displaying Current Glucose in Bobble

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

+ 22 - 2
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -65,6 +65,8 @@ extension Home {
         @Published var waitForSuggestion: Bool = false
         @Published var glucoseFromPersistence: [GlucoseStored] = []
         @Published var manualGlucoseFromPersistence: [GlucoseStored] = []
+        @Published var latestTwoGlucoseValues: [GlucoseStored] = []
+        @Published var latestTwoManualGlucoseValues: [GlucoseStored] = []
         @Published var carbsFromPersistence: [CarbEntryStored] = []
         @Published var fpusFromPersistence: [CarbEntryStored] = []
         @Published var determinationsFromPersistence: [OrefDetermination] = []
@@ -641,7 +643,7 @@ extension Home.StateModel {
             onContext: context,
             predicate: NSPredicate.glucose,
             key: "date",
-            ascending: false,
+            ascending: true,
             fetchLimit: 288
         )
 
@@ -654,6 +656,15 @@ extension Home.StateModel {
 
     @MainActor private func updateGlucoseArray(with objects: [GlucoseStored]) {
         glucoseFromPersistence = objects
+
+        // Check if there are enough elements to get the last two
+        if let last = objects.last, let secondLast = objects.dropLast().last {
+            latestTwoGlucoseValues = [last, secondLast]
+        } else if let last = objects.last {
+            latestTwoGlucoseValues = [last]
+        } else {
+            latestTwoGlucoseValues = []
+        }
     }
 
     // Setup Manual Glucose
@@ -676,7 +687,7 @@ extension Home.StateModel {
             onContext: context,
             predicate: NSPredicate.manualGlucose,
             key: "date",
-            ascending: false,
+            ascending: true,
             fetchLimit: 288
         )
 
@@ -689,6 +700,15 @@ extension Home.StateModel {
 
     @MainActor private func updateManualGlucoseArray(with objects: [GlucoseStored]) {
         manualGlucoseFromPersistence = objects
+
+        // Check if there are enough elements to get the last two
+        if let last = objects.last, let secondLast = objects.dropLast().last {
+            latestTwoManualGlucoseValues = [last, secondLast]
+        } else if let last = objects.last {
+            latestTwoManualGlucoseValues = [last]
+        } else {
+            latestTwoManualGlucoseValues = []
+        }
     }
 
     // Setup Carbs

+ 5 - 9
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -926,21 +926,17 @@ extension MainChartView {
             return nil
         }
 
-        // sort by date
-        let sortedGlucose = state.glucoseFromPersistence
-            .sorted { $0.date?.timeIntervalSince1970 ?? 0 < $1.date?.timeIntervalSince1970 ?? 0 }
-
         var low = 0
-        var high = sortedGlucose.count - 1
+        var high = state.glucoseFromPersistence.count - 1
         var closestGlucose: GlucoseStored?
 
         // binary search to find next glucose
         while low <= high {
             let mid = low + (high - low) / 2
-            let midTime = sortedGlucose[mid].date?.timeIntervalSince1970 ?? 0
+            let midTime = state.glucoseFromPersistence[mid].date?.timeIntervalSince1970 ?? 0
 
             if midTime == time {
-                return sortedGlucose[mid]
+                return state.glucoseFromPersistence[mid]
             } else if midTime < time {
                 low = mid + 1
             } else {
@@ -949,7 +945,7 @@ extension MainChartView {
 
             // update if necessary
             if closestGlucose == nil || abs(midTime - time) < abs(closestGlucose!.date?.timeIntervalSince1970 ?? 0 - time) {
-                closestGlucose = sortedGlucose[mid]
+                closestGlucose = state.glucoseFromPersistence[mid]
             }
         }
 
@@ -1052,7 +1048,7 @@ extension MainChartView {
 
         return basalPoints
     }
-    
+
     /// update start and  end marker to fix scroll update problem with x axis
     private func updateStartEndMarkers() {
         startMarker = Date(timeIntervalSince1970: TimeInterval(NSDate().timeIntervalSince1970 - 86400))

+ 8 - 8
FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift

@@ -24,10 +24,10 @@ struct CurrentGlucoseView: View {
 
     @Environment(\.colorScheme) var colorScheme
 
+    // Combine and sort the glucose values via computed property
+    /// -Returns: the latest GlucoseStored object as the last element in the Array
     private var combinedGlucoseValues: [GlucoseStored] {
-        // Combine and sort the glucose values
-        let combined = (glucose + manualGlucose).sorted { $0.date ?? Date() > $1.date ?? Date() }
-        return combined
+        (glucose + manualGlucose).sorted { $0.date ?? Date() < $1.date ?? Date() }
     }
 
     private var glucoseFormatter: NumberFormatter {
@@ -83,7 +83,7 @@ struct CurrentGlucoseView: View {
 
                 VStack(alignment: .center) {
                     HStack {
-                        if let glucoseValue = combinedGlucoseValues.first?.glucose {
+                        if let glucoseValue = combinedGlucoseValues.last?.glucose {
                             let displayGlucose = units == .mgdL ? Decimal(glucoseValue).description : Decimal(glucoseValue)
                                 .formattedAsMmolL
                             Text(
@@ -98,7 +98,7 @@ struct CurrentGlucoseView: View {
                         }
                     }
                     HStack {
-                        let minutesAgo = -1 * (combinedGlucoseValues.first?.date?.timeIntervalSinceNow ?? 0) / 60
+                        let minutesAgo = -1 * (combinedGlucoseValues.last?.date?.timeIntervalSinceNow ?? 0) / 60
                         let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? ""
                         Text(
                             minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : (
@@ -115,7 +115,7 @@ struct CurrentGlucoseView: View {
                     }.frame(alignment: .top)
                 }
             }
-            .onChange(of: combinedGlucoseValues.first?.directionEnum) { newDirection in
+            .onChange(of: combinedGlucoseValues.last?.directionEnum) { newDirection in
                 withAnimation {
                     switch newDirection {
                     case .doubleUp,
@@ -160,8 +160,8 @@ struct CurrentGlucoseView: View {
             return "--"
         }
 
-        let lastGlucose = combinedGlucoseValues.first?.glucose ?? 0
-        let secondLastGlucose = combinedGlucoseValues.dropFirst().first?.glucose ?? 0
+        let lastGlucose = combinedGlucoseValues.last?.glucose ?? 0
+        let secondLastGlucose = combinedGlucoseValues.dropLast().last?.glucose ?? 0
         let delta = lastGlucose - secondLastGlucose
         let deltaAsDecimal = units == .mmolL ? Decimal(delta).asMmolL : Decimal(delta)
         return deltaFormatter.string(from: deltaAsDecimal as NSNumber) ?? "--"

+ 2 - 2
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -143,8 +143,8 @@ extension Home {
                 lowGlucose: $state.lowGlucose,
                 highGlucose: $state.highGlucose,
                 cgmAvailable: $state.cgmAvailable,
-                glucose: state.glucoseFromPersistence,
-                manualGlucose: state.manualGlucoseFromPersistence
+                glucose: state.latestTwoGlucoseValues,
+                manualGlucose: state.latestTwoManualGlucoseValues
             ).scaleEffect(0.9)
                 .onTapGesture {
                     state.openCGM()