Ver código fonte

refactor storeGlucose func

polscm32 2 anos atrás
pai
commit
48b8736680
1 arquivos alterados com 36 adições e 18 exclusões
  1. 36 18
      FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

+ 36 - 18
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -46,28 +46,46 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
     }
 
     func storeGlucose(_ glucose: [BloodGlucose]) {
-        guard let latestGlucose = glucose.last, let lastGlucoseValue = latestGlucose.glucose else { return }
-
         processQueue.sync {
             debug(.deviceManager, "start storage glucose")
 
             self.coredataContext.perform {
-                let newItem = GlucoseStored(context: self.coredataContext)
-                newItem.id = UUID()
-                newItem.glucose = Int16(lastGlucoseValue)
-                newItem.date = latestGlucose.dateString
-                newItem.direction = latestGlucose.direction?.symbol
-
-                if self.coredataContext.hasChanges {
-                    do {
-                        try self.coredataContext.save()
-                        debugPrint(
-                            "Glucose Storage: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) saved glucose to core data"
-                        )
-                    } catch {
-                        debugPrint(
-                            "Glucose Storage: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) failed to save glucose to core data"
-                        )
+                for glucoseEntry in glucose {
+                    guard let glucoseValue = glucoseEntry.glucose else { continue }
+
+                    let dateString = glucoseEntry.dateString
+                    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = GlucoseStored.fetchRequest()
+                    fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [
+                        NSPredicate(format: "date == %@", dateString as NSDate),
+                        NSPredicate.predicateForOneDayAgo
+                    ])
+                    fetchRequest.fetchLimit = 1
+                    fetchRequest.propertiesToFetch = ["date"]
+                    fetchRequest.resultType = .dictionaryResultType
+
+                    let count = (try? self.coredataContext.count(for: fetchRequest)) ?? 0
+                    if count > 0 {
+                        debugPrint("duplicate glucose detected. Skipping saving...")
+                        continue
+                    }
+
+                    let newItem = GlucoseStored(context: self.coredataContext)
+                    newItem.id = UUID()
+                    newItem.glucose = Int16(glucoseValue)
+                    newItem.date = dateString
+                    newItem.direction = glucoseEntry.direction?.symbol
+
+                    if self.coredataContext.hasChanges {
+                        do {
+                            try self.coredataContext.save()
+                            debugPrint(
+                                "Glucose Storage: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) saved glucose to core data"
+                            )
+                        } catch {
+                            debugPrint(
+                                "Glucose Storage: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) failed to save glucose to core data: \(error)"
+                            )
+                        }
                     }
                 }
             }