Jelajahi Sumber

Use a single shared viewContext in TrioRemoteControl

Jonas Björkert 1 tahun lalu
induk
melakukan
e38eabccd9

+ 6 - 9
FreeAPS/Sources/Modules/RemoteControl/TrioRemoteControl.swift

@@ -13,9 +13,11 @@ class TrioRemoteControl: Injectable {
     private let timeWindow: TimeInterval = 600 // Defines how old messages that are accepted, 10 minutes
 
     private let pumpHistoryFetchContext: NSManagedObjectContext
+    private let viewContext: NSManagedObjectContext
 
     private init() {
         pumpHistoryFetchContext = CoreDataStack.shared.newTaskContext()
+        viewContext = CoreDataStack.shared.persistentContainer.viewContext
         injectServices(FreeAPSApp.resolver)
     }
 
@@ -297,8 +299,6 @@ class TrioRemoteControl: Injectable {
             return
         }
 
-        let viewContext = CoreDataStack.shared.persistentContainer.viewContext
-
         let presetIDs = await overrideStorage.fetchForOverridePresets()
 
         let presets = presetIDs.compactMap { id in
@@ -316,8 +316,6 @@ class TrioRemoteControl: Injectable {
     @MainActor private func enactOverridePreset(preset: OverrideStored) async {
         await disableAllActiveOverrides()
 
-        let viewContext = CoreDataStack.shared.persistentContainer.viewContext
-
         preset.enabled = true
         preset.date = Date()
         preset.isUploadedToNS = false
@@ -335,19 +333,18 @@ class TrioRemoteControl: Injectable {
     }
 
     @MainActor func disableAllActiveOverrides() async {
-        let viewContext = CoreDataStack.shared.persistentContainer.viewContext
         let ids = await overrideStorage.loadLatestOverrideConfigurations(fetchLimit: 0) // 0 = no fetch limit
 
         let didPostNotification = await viewContext.perform { () -> Bool in
             do {
                 let results = try ids.compactMap { id in
-                    try viewContext.existingObject(with: id) as? OverrideStored
+                    try self.viewContext.existingObject(with: id) as? OverrideStored
                 }
 
                 guard !results.isEmpty else { return false }
 
                 for canceledOverride in results where canceledOverride.enabled {
-                    let newOverrideRunStored = OverrideRunStored(context: viewContext)
+                    let newOverrideRunStored = OverrideRunStored(context: self.viewContext)
                     newOverrideRunStored.id = UUID()
                     newOverrideRunStored.name = canceledOverride.name
                     newOverrideRunStored.startDate = canceledOverride.date ?? .distantPast
@@ -360,8 +357,8 @@ class TrioRemoteControl: Injectable {
                     canceledOverride.enabled = false
                 }
 
-                if viewContext.hasChanges {
-                    try viewContext.save()
+                if self.viewContext.hasChanges {
+                    try self.viewContext.save()
                     Foundation.NotificationCenter.default.post(name: .willUpdateOverrideConfiguration, object: nil)
                     return true
                 } else {