Procházet zdrojové kódy

Add conditional subscription logic; add additional logging WIP

Deniz Cengiz před 1 rokem
rodič
revize
0a918b6a44

+ 4 - 0
FreeAPS/Sources/Logger/Logger.swift

@@ -113,6 +113,7 @@ final class Logger {
     static let apsManager = Logger(category: .apsManager, reporter: baseReporter)
     static let nightscout = Logger(category: .nightscout, reporter: baseReporter)
     static let remoteControl = Logger(category: .remoteControl, reporter: baseReporter)
+    static let bolusState = Logger(category: .bolusState, reporter: baseReporter)
 
     enum Category: String {
         case `default`
@@ -123,6 +124,7 @@ final class Logger {
         case apsManager
         case nightscout
         case remoteControl
+        case bolusState
 
         var name: String {
             rawValue.capitalizingFirstLetter()
@@ -138,6 +140,7 @@ final class Logger {
             case .apsManager: return .apsManager
             case .nightscout: return .nightscout
             case .remoteControl: return .remoteControl
+            case .bolusState: return .bolusState
             }
         }
 
@@ -146,6 +149,7 @@ final class Logger {
             switch self {
             case .default: return OSLog.default
             case .apsManager,
+                 .bolusState,
                  .businessLogic,
                  .deviceManager,
                  .nightscout,

+ 44 - 4
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -119,12 +119,33 @@ extension Bolus {
         let glucoseFetchContext = CoreDataStack.shared.newTaskContext()
         let determinationFetchContext = CoreDataStack.shared.newTaskContext()
 
+        var isActive: Bool = false {
+            didSet {
+                if !isActive {
+                    debug(.bolusState, "unsubscribing and unregistering fired")
+                    broadcaster.unregister(DeterminationObserver.self, observer: self)
+                    broadcaster.unregister(BolusFailureObserver.self, observer: self)
+                    unsubscribe()
+                }
+            }
+        }
+
         private var coreDataPublisher: AnyPublisher<Set<NSManagedObject>, Never>?
         private var subscriptions = Set<AnyCancellable>()
 
         typealias PumpEvent = PumpEventStored.EventType
 
+        func unsubscribe() {
+            subscriptions.forEach { $0.cancel() }
+            subscriptions.removeAll()
+        }
+
         override func subscribe() {
+            guard isActive else {
+                return
+            }
+
+            debug(.bolusState, "subscribe fired")
             coreDataPublisher =
                 changedObjectsOnManagedObjectContextDidSavePublisher()
                     .receive(on: DispatchQueue.global(qos: .background))
@@ -141,13 +162,15 @@ extension Bolus {
             broadcaster.unregister(BolusFailureObserver.self, observer: self)
 
             // Cancel Combine subscriptions
-            subscriptions.forEach { $0.cancel() }
-            subscriptions.removeAll()
+//            subscriptions.forEach { $0.cancel() }
+//            subscriptions.removeAll()
+            unsubscribe()
 
-            debugPrint("Bolus.StateModel deinitialized")
+            debug(.bolusState, "Bolus.StateModel deinitialized")
         }
 
         private func setupBolusStateConcurrently() {
+            debug(.bolusState, "setupBolusStateConcurrently fired")
             Task {
                 await withTaskGroup(of: Void.self) { group in
                     group.addTask {
@@ -341,6 +364,7 @@ extension Bolus {
 
         /// Calculate insulin recommendation
         func calculateInsulin() -> Decimal {
+            debug(.bolusState, "calculateInsulin fired")
             let isfForCalculation = isf
 
             // insulin needed for the current blood glucose
@@ -398,6 +422,7 @@ extension Bolus {
 
         func invokeTreatmentsTask() {
             Task {
+                debug(.bolusState, "invokeTreatmentsTask fired")
                 await MainActor.run {
                     self.addButtonPressed = true
                 }
@@ -437,6 +462,7 @@ extension Bolus {
         // MARK: - Insulin
 
         private func handleInsulin(isExternal: Bool) async throws {
+            debug(.bolusState, "handleInsulin fired")
             if !isExternal {
                 await addPumpInsulin()
             } else {
@@ -585,7 +611,13 @@ extension Bolus {
 
 extension Bolus.StateModel: DeterminationObserver, BolusFailureObserver {
     func determinationDidUpdate(_: Determination) {
+        guard isActive else {
+            debug(.bolusState, "skipping determinationDidUpdate; view not active")
+            return
+        }
+
         DispatchQueue.main.async {
+            debug(.bolusState, "determinationDidUpdate fired")
             self.waitForSuggestion = false
             if self.addButtonPressed {
                 self.hideModal()
@@ -595,6 +627,7 @@ extension Bolus.StateModel: DeterminationObserver, BolusFailureObserver {
 
     func bolusDidFail() {
         DispatchQueue.main.async {
+            debug(.bolusState, "bolusDidFail fired")
             self.waitForSuggestion = false
             if self.addButtonPressed {
                 self.hideModal()
@@ -762,11 +795,18 @@ extension Bolus.StateModel {
 
 extension Bolus.StateModel {
     @MainActor func updateForecasts(with forecastData: Determination? = nil) async {
+        guard isActive else {
+            return
+                debug(.bolusState, "updateForecasts not fired")
+        }
+
+        debug(.bolusState, "updateForecasts fired")
         if let forecastData = forecastData {
             simulatedDetermination = forecastData
         } else {
             simulatedDetermination = await Task { [self] in
-                await apsManager.simulateDetermineBasal(carbs: carbs, iob: amount)
+                debug(.bolusState, "calling simulateDetermineBasal to get forecast data")
+                return await apsManager.simulateDetermineBasal(carbs: carbs, iob: amount)
             }.value
         }
 

+ 2 - 0
FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift

@@ -344,10 +344,12 @@ extension Bolus {
             })
             .onAppear {
                 configureView {
+                    state.isActive = true
                     state.insulinCalculated = state.calculateInsulin()
                 }
             }
             .onDisappear {
+                state.isActive = false
                 state.addButtonPressed = false
             }
             .sheet(isPresented: $state.showInfo) {