Просмотр исходного кода

this should clean up CoreData to run thread-safe

Marc G Fournier 3 лет назад
Родитель
Сommit
99f657b28c

+ 19 - 12
FreeAPS/Sources/APS/APSManager.swift

@@ -79,7 +79,7 @@ final class BaseAPSManager: APSManager, Injectable {
         }
     }
 
-    let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+    let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
 
     private var openAPS: OpenAPS!
 
@@ -1103,12 +1103,17 @@ final class BaseAPSManager: APSManager, Injectable {
 
         // MARK: Save to Median to CoreData
 
-        let saveMedianToCoreData = BGmedian(context: coredataContext)
-        saveMedianToCoreData.date = Date()
-        saveMedianToCoreData.median = median.total as NSDecimalNumber
-        saveMedianToCoreData.median_1 = median.day as NSDecimalNumber
-        saveMedianToCoreData.median_7 = median.week as NSDecimalNumber
-        saveMedianToCoreData.median_30 = median.month as NSDecimalNumber
+        coredataContext.perform {
+            let saveMedianToCoreData = BGmedian(context: self.coredataContext)
+
+            saveMedianToCoreData.date = Date()
+            saveMedianToCoreData.median = median.total as NSDecimalNumber
+            saveMedianToCoreData.median_1 = median.day as NSDecimalNumber
+            saveMedianToCoreData.median_7 = median.week as NSDecimalNumber
+            saveMedianToCoreData.median_30 = median.month as NSDecimalNumber
+
+            try? self.coredataContext.save()
+        }
 
         var hbs = Durations(
             day: roundDecimal(NGSPa1CStatisticValue, 1),
@@ -1331,12 +1336,14 @@ final class BaseAPSManager: APSManager, Injectable {
     private func loopStats(loopStatRecord: LoopStats) {
         let LoopStatsStartedAt = Date()
 
-        let nLS = LoopStatRecord(context: coredataContext)
-        nLS.start = loopStatRecord.start
-        nLS.end = loopStatRecord.end ?? Date()
-        nLS.loopStatus = loopStatRecord.loopStatus
-        nLS.duration = loopStatRecord.duration ?? 0.0
         coredataContext.perform {
+            let nLS = LoopStatRecord(context: self.coredataContext)
+
+            nLS.start = loopStatRecord.start
+            nLS.end = loopStatRecord.end ?? Date()
+            nLS.loopStatus = loopStatRecord.loopStatus
+            nLS.duration = loopStatRecord.duration ?? 0.0
+
             try? self.coredataContext.save()
         }
 

+ 13 - 11
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -9,7 +9,7 @@ final class OpenAPS {
 
     private let storage: FileStorage
 
-    let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+    let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
 
     init(storage: FileStorage) {
         self.storage = storage
@@ -84,22 +84,24 @@ final class OpenAPS {
 
                     // MARK: Save to CoreData also. To do: Remove JSON saving
 
-                    var saveToTDD = TDD(context: self.coredataContext)
-
                     if suggestion.tdd ?? 0 > 0 {
-                        // let saveToTDD = TDD(context: self.coredataContext)
-                        saveToTDD.timestamp = suggestion.timestamp ?? Date()
-                        saveToTDD.tdd = (suggestion.tdd ?? 0) as NSDecimalNumber?
                         self.coredataContext.perform {
+                            let saveToTDD = TDD(context: self.coredataContext)
+
+                            saveToTDD.timestamp = suggestion.timestamp ?? Date()
+                            saveToTDD.tdd = (suggestion.tdd ?? 0) as NSDecimalNumber?
+
                             try? self.coredataContext.save()
                         }
 
-                        let saveToInsulin = InsulinDistribution(context: self.coredataContext)
-                        saveToInsulin.bolus = (suggestion.insulin?.bolus ?? 0) as NSDecimalNumber?
-                        saveToInsulin.scheduledBasal = (suggestion.insulin?.scheduled_basal ?? 0) as NSDecimalNumber?
-                        saveToInsulin.tempBasal = (suggestion.insulin?.temp_basal ?? 0) as NSDecimalNumber?
-                        saveToInsulin.date = Date()
                         self.coredataContext.perform {
+                            let saveToInsulin = InsulinDistribution(context: self.coredataContext)
+
+                            saveToInsulin.bolus = (suggestion.insulin?.bolus ?? 0) as NSDecimalNumber?
+                            saveToInsulin.scheduledBasal = (suggestion.insulin?.scheduled_basal ?? 0) as NSDecimalNumber?
+                            saveToInsulin.tempBasal = (suggestion.insulin?.temp_basal ?? 0) as NSDecimalNumber?
+                            saveToInsulin.date = Date()
+
                             try? self.coredataContext.save()
                         }
                     }

+ 6 - 4
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -20,7 +20,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
     @Injected() private var storage: FileStorage!
     @Injected() private var broadcaster: Broadcaster!
 
-    let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+    let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
 
     init(resolver: Resolver) {
         injectServices(resolver)
@@ -47,10 +47,12 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                 carbDate = carbs[0].createdAt
             }
             if cbs != 0 {
-                let carbDataForStats = Carbohydrates(context: coredataContext)
-                carbDataForStats.date = carbDate
-                carbDataForStats.carbs = cbs as NSDecimalNumber
                 self.coredataContext.perform {
+                    let carbDataForStats = Carbohydrates(context: self.coredataContext)
+
+                    carbDataForStats.date = carbDate
+                    carbDataForStats.carbs = cbs as NSDecimalNumber
+
                     try? self.coredataContext.save()
                 }
             }

+ 6 - 8
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -25,7 +25,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
     @Injected() private var broadcaster: Broadcaster!
     @Injected() private var settingsManager: SettingsManager!
 
-    let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+    let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
 
     private enum Config {
         static let filterTime: TimeInterval = 4.5 * 60
@@ -65,18 +65,16 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
                     bgDate = glucose[0].dateString
                 }
 
-                // coredataContext.performAndWait {
-                var dataForForStats = Readings(context: coredataContext)
-
                 if bg_ != 0 {
-                    // let dataForStats = Readings(context: coredataContext)
-                    dataForForStats.date = bgDate
-                    dataForForStats.glucose = Int16(bg_)
                     self.coredataContext.perform {
+                        let dataForForStats = Readings(context: self.coredataContext)
+
+                        dataForForStats.date = bgDate
+                        dataForForStats.glucose = Int16(bg_)
+
                         try? self.coredataContext.save()
                     }
                 }
-                // }
             }
 
             self.storage.transaction { storage in