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

+ 7 - 0
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -61,5 +61,12 @@ extension DataTable {
                 await nightscoutManager.deleteManualGlucose(withID: id)
             }
         }
+
+        func deleteGlucoseFromHealth(withSyncID id: String) {
+            Task.detached { [weak self] in
+                guard let self = self else { return }
+                await self.healthkitManager.deleteGlucose(syncID: id)
+            }
+        }
     }
 }

+ 5 - 0
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -66,6 +66,11 @@ extension DataTable {
                         }
                     }
 
+                    // Delete Glucose from Apple Health
+                    if let id = glucoseToDelete.id?.uuidString {
+                        self.provider.deleteGlucoseFromHealth(withSyncID: id)
+                    }
+
                     taskContext.delete(glucoseToDelete)
 
                     guard taskContext.hasChanges else { return }

+ 36 - 22
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -25,7 +25,7 @@ protocol HealthKitManager: GlucoseSource {
     /// Enable background delivering objects from Apple Health to Trio
     func enableBackgroundDelivery()
     /// Delete glucose with syncID
-    func deleteGlucose(syncID: String)
+    func deleteGlucose(syncID: String) async
     /// delete carbs with syncID
     func deleteCarbs(syncID: String, fpuID: String)
     /// delete insulin with syncID
@@ -434,7 +434,41 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsStoredDeleg
             }
         }
     }
-    
+
+    // Delete Glucose/Carbs/Insulin
+
+    func deleteGlucose(syncID: String) async {
+        guard settingsManager.settings.useAppleHealth,
+              let sampleType = Config.healthBGObject,
+              checkAvailabilitySave(objectTypeToHealthStore: sampleType)
+        else { return }
+
+        let predicate = HKQuery.predicateForObjects(
+            withMetadataKey: HKMetadataKeySyncIdentifier,
+            operatorType: .equalTo,
+            value: syncID
+        )
+
+        do {
+            try await deleteObjects(of: sampleType, predicate: predicate)
+            debug(.service, "Successfully deleted glucose sample with syncID: \(syncID)")
+        } catch {
+            warning(.service, "Failed to delete glucose sample with syncID: \(syncID)", error: error)
+        }
+    }
+
+    private func deleteObjects(of sampleType: HKSampleType, predicate: NSPredicate) async throws {
+        try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
+            healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, _, error in
+                if let error = error {
+                    continuation.resume(throwing: error)
+                } else if success {
+                    continuation.resume(returning: ())
+                }
+            }
+        }
+    }
+
     // Observer that notifies when new Glucose values arrive in Apple Health
 
     func createBGObserver() {
@@ -584,26 +618,6 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsStoredDeleg
         fetch(nil)
     }
 
-    func deleteGlucose(syncID: String) {
-        guard settingsManager.settings.useAppleHealth,
-              let sampleType = Config.healthBGObject,
-              checkAvailabilitySave(objectTypeToHealthStore: sampleType)
-        else { return }
-
-        processQueue.async {
-            let predicate = HKQuery.predicateForObjects(
-                withMetadataKey: HKMetadataKeySyncIdentifier,
-                operatorType: .equalTo,
-                value: syncID
-            )
-
-            self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in
-                guard let error = error else { return }
-                warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error)
-            }
-        }
-    }
-
     // - MARK Carbs function
 
     func deleteCarbs(syncID: String, fpuID: String) {