polscm32 aka Marvout пре 1 година
родитељ
комит
23f0be73de

+ 2 - 2
FreeAPS/Sources/APS/APSManager.swift

@@ -670,7 +670,7 @@ final class BaseAPSManager: APSManager, Injectable {
 
     private func enactDetermination() async throws {
         guard let determinationID = await determinationStorage
-            .fetchLastDeterminationObjectID(predicate: NSPredicate.predicateFor30MinAgoForDetermination, fetchLimit: 1).first
+            .fetchLastDeterminationObjectID(predicate: NSPredicate.predicateFor30MinAgoForDetermination).first
         else {
             throw APSError.apsError(message: "Determination not found")
         }
@@ -725,7 +725,7 @@ final class BaseAPSManager: APSManager, Injectable {
 
     private func reportEnacted(wasEnacted: Bool) async {
         guard let determinationID = await determinationStorage
-            .fetchLastDeterminationObjectID(predicate: NSPredicate.predicateFor30MinAgoForDetermination, fetchLimit: 1).first
+            .fetchLastDeterminationObjectID(predicate: NSPredicate.predicateFor30MinAgoForDetermination).first
         else {
             return
         }

+ 3 - 4
FreeAPS/Sources/APS/Storage/DeterminationStorage.swift

@@ -3,7 +3,7 @@ import Foundation
 import Swinject
 
 protocol DeterminationStorage {
-    func fetchLastDeterminationObjectID(predicate: NSPredicate, fetchLimit: Int) async -> [NSManagedObjectID]
+    func fetchLastDeterminationObjectID(predicate: NSPredicate) async -> [NSManagedObjectID]
     func getForecasts(for determinationID: NSManagedObjectID, in context: NSManagedObjectContext) -> [Forecast]
     func getForecastValues(for forecastID: NSManagedObjectID, in context: NSManagedObjectContext) -> [ForecastValue]
 }
@@ -16,15 +16,14 @@ final class BaseDeterminationStorage: DeterminationStorage, Injectable {
         injectServices(resolver)
     }
 
-    func fetchLastDeterminationObjectID(predicate: NSPredicate, fetchLimit: Int) async -> [NSManagedObjectID] {
+    func fetchLastDeterminationObjectID(predicate: NSPredicate) async -> [NSManagedObjectID] {
         let results = await CoreDataStack.shared.fetchEntitiesAsync(
             ofType: OrefDetermination.self,
             onContext: backgroundContext,
             predicate: predicate,
             key: "deliverAt",
             ascending: false,
-            fetchLimit: fetchLimit,
-            batchSize: 50
+            fetchLimit: 1
         )
         return await backgroundContext.perform {
             results.map(\.objectID)

+ 1 - 2
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -621,8 +621,7 @@ extension Bolus.StateModel {
     private func setupDeterminationsArray() {
         Task {
             let ids = await determinationStorage.fetchLastDeterminationObjectID(
-                predicate: NSPredicate.enactedDetermination,
-                fetchLimit: 1
+                predicate: NSPredicate.enactedDetermination
             )
             await updateDeterminationsArray(with: ids)
         }

+ 20 - 5
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -687,15 +687,30 @@ extension Home.StateModel {
         }
     }
 
+    // Custom fetch to more efficiently filter only for cob and iob
+    private func fetchCobAndIob() async -> [NSManagedObjectID] {
+        let results = await CoreDataStack.shared.fetchEntitiesAsync(
+            ofType: OrefDetermination.self,
+            onContext: context,
+            predicate: NSPredicate.determinationsForCobIobCharts,
+            key: "deliverAt",
+            ascending: true,
+            fetchLimit: 288,
+            batchSize: 50,
+            propertiesToFetch: ["cob", "iob"]
+        )
+
+        return await context.perform {
+            return results.map(\.objectID)
+        }
+    }
+
     // Setup Determinations
     private func setupDeterminationsArray() {
         Task {
             async let enactedObjectIDs = determinationStorage
-                .fetchLastDeterminationObjectID(predicate: NSPredicate.enactedDetermination, fetchLimit: 1)
-            async let enactedAndNonEnactedObjectIDs = determinationStorage.fetchLastDeterminationObjectID(
-                predicate: NSPredicate
-                    .determinationsForCobIobCharts, fetchLimit: 288
-            )
+                .fetchLastDeterminationObjectID(predicate: NSPredicate.enactedDetermination)
+            async let enactedAndNonEnactedObjectIDs = fetchCobAndIob()
 
             let enactedIDs = await enactedObjectIDs
             let enactedAndNonEnactedIDs = await enactedAndNonEnactedObjectIDs

+ 8 - 4
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -103,6 +103,10 @@ struct MainChartView: View {
         units == .mgdL ? 30 : 1.66
     }
 
+    private var interpolationFactor: Double {
+        Double(state.determinationsFromPersistence.first?.cob ?? 1) * 10
+    }
+
     private var selectedGlucose: GlucoseStored? {
         if let selection = selection {
             let lowerBound = selection.addingTimeInterval(-120)
@@ -656,18 +660,18 @@ extension MainChartView {
 
     private func drawIOB() -> some ChartContent {
         ForEach(state.enactedAndNonEnactedDeterminations) { iob in
-            let amount: Double = (iob.iob?.doubleValue ?? 0 / 10)
+            let amount: Double = (iob.iob?.doubleValue ?? 0 / interpolationFactor)
             let date: Date = iob.deliverAt ?? Date()
 
             LineMark(x: .value("Time", date), y: .value("Amount", amount))
-                .foregroundStyle(Color.purple)
+                .foregroundStyle(Color.darkerBlue)
             AreaMark(x: .value("Time", date), y: .value("Amount", amount))
                 .foregroundStyle(
                     LinearGradient(
                         gradient: Gradient(
                             colors: [
-                                Color.purple.opacity(0.8),
-                                Color.purple.opacity(0.01)
+                                Color.darkerBlue.opacity(0.8),
+                                Color.darkerBlue.opacity(0.01)
                             ]
                         ),
                         startPoint: .top,

+ 1 - 2
FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -101,8 +101,7 @@ extension ISFEditor {
         private func setupDeterminationsArray() {
             Task {
                 let ids = await determinationStorage.fetchLastDeterminationObjectID(
-                    predicate: NSPredicate.enactedDetermination,
-                    fetchLimit: 1
+                    predicate: NSPredicate.enactedDetermination
                 )
                 await updateDeterminationsArray(with: ids)
             }