Procházet zdrojové kódy

Merge pull request #511 from nightscout/fix-treatment-state-deinit

Refactor Treatments State Cleanup to onDisappear to Prevent Deinit Crashes
Deniz Cengiz před 1 rokem
rodič
revize
8ad4d24f06

+ 13 - 9
Trio/Sources/Modules/Treatments/TreatmentsStateModel.swift

@@ -161,22 +161,26 @@ extension Treatments {
         }
         }
 
 
         deinit {
         deinit {
-            // Unregister from broadcaster
-            if let broadcaster = broadcaster {
-                broadcaster.unregister(DeterminationObserver.self, observer: self)
-                broadcaster.unregister(BolusFailureObserver.self, observer: self)
-            }
+            debug(.bolusState, "StateModel deinit called")
+        }
 
 
-            // Cancel Combine subscriptions
-            unsubscribe()
+        private var hasCleanedUp = false
 
 
+        func cleanupTreatmentState() {
+            guard !hasCleanedUp else { return }
+            hasCleanedUp = true
+
+            unsubscribe()
             bolusProgressCancellable?.cancel()
             bolusProgressCancellable?.cancel()
 
 
-            debug(.bolusState, "Bolus.StateModel deinitialized")
+            broadcaster?.unregister(DeterminationObserver.self, observer: self)
+            broadcaster?.unregister(BolusFailureObserver.self, observer: self)
+
+            debug(.bolusState, "StateModel cleanup() finished")
         }
         }
 
 
         private func setupBolusStateConcurrently() {
         private func setupBolusStateConcurrently() {
-            debug(.bolusState, "setupBolusStateConcurrently fired")
+            debug(.bolusState, "Setting up bolus state concurrently...")
             Task {
             Task {
                 do {
                 do {
                     try await withThrowingTaskGroup(of: Void.self) { group in
                     try await withThrowingTaskGroup(of: Void.self) { group in

+ 3 - 0
Trio/Sources/Modules/Treatments/View/TreatmentsRootView.swift

@@ -388,6 +388,9 @@ extension Treatments {
             .onDisappear {
             .onDisappear {
                 state.isActive = false
                 state.isActive = false
                 state.addButtonPressed = false
                 state.addButtonPressed = false
+
+                // Cancel all Combine subscriptions and unregister State from broadcaster
+                state.cleanupTreatmentState()
             }
             }
             .sheet(isPresented: $state.showInfo) {
             .sheet(isPresented: $state.showInfo) {
                 PopupView(state: state)
                 PopupView(state: state)