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

Use Dispatchqueue to serialize handing of Core Data change notifications

Should fix crash due to a deallocation of an object in registerHandlers() func in ContactImageManager class
polscm32 1 год назад
Родитель
Сommit
0a5bbfd489

+ 3 - 1
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -119,6 +119,8 @@ extension Home {
         let batteryFetchContext = CoreDataStack.shared.newTaskContext()
         let viewContext = CoreDataStack.shared.persistentContainer.viewContext
 
+        // Queue for handling Core Data change notifications
+        private let queue = DispatchQueue(label: "HomeStateModel.queue")
         private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
         private var subscriptions = Set<AnyCancellable>()
 
@@ -127,7 +129,7 @@ extension Home {
         override func subscribe() {
             coreDataPublisher =
                 changedObjectsOnManagedObjectContextDidSavePublisher()
-                    .receive(on: DispatchQueue.global(qos: .background))
+                    .receive(on: queue)
                     .share()
                     .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Modules/Treatments/TreatmentsStateModel.swift

@@ -121,6 +121,8 @@ extension Treatments {
 
         var isActive: Bool = false
 
+        // Queue for handling Core Data change notifications
+        private let queue = DispatchQueue(label: "TreatmentsStateModel.queue")
         private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
         private var subscriptions = Set<AnyCancellable>()
 
@@ -142,7 +144,7 @@ extension Treatments {
             debug(.bolusState, "subscribe fired")
             coreDataPublisher =
                 changedObjectsOnManagedObjectContextDidSavePublisher()
-                    .receive(on: DispatchQueue.global(qos: .background))
+                    .receive(on: queue)
                     .share()
                     .eraseToAnyPublisher()
             registerHandlers()

+ 3 - 1
FreeAPS/Sources/Services/Calendar/CalendarManager.swift

@@ -19,6 +19,8 @@ final class BaseCalendarManager: CalendarManager, Injectable {
     @Injected() private var glucoseStorage: GlucoseStorage!
     @Injected() private var storage: FileStorage!
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseCalendarManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -62,7 +64,7 @@ final class BaseCalendarManager: CalendarManager, Injectable {
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/ContactImage/ContactImageManager.swift

@@ -32,6 +32,8 @@ final class BaseContactImageManager: NSObject, ContactImageManager, Injectable {
     private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
     private let backgroundContext = CoreDataStack.shared.newTaskContext()
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseContactImageManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -54,7 +56,7 @@ final class BaseContactImageManager: NSObject, ContactImageManager, Injectable {
         units = settingsManager.settings.units
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -57,6 +57,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
 
     private var backgroundContext = CoreDataStack.shared.newTaskContext()
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseHealthKitManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -69,7 +71,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift

@@ -47,6 +47,8 @@ final class LiveActivityBridge: Injectable, ObservableObject, SettingsObserver {
 
     let context = CoreDataStack.shared.newTaskContext()
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "LiveActivityBridge.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
     private let orefDeterminationSubject = PassthroughSubject<Void, Never>()
@@ -54,7 +56,7 @@ final class LiveActivityBridge: Injectable, ObservableObject, SettingsObserver {
     init(resolver: Resolver) {
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/Network/Nightscout/NightscoutManager.swift

@@ -79,6 +79,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     private var lastEnactedDetermination: Determination?
     private var lastSuggestedDetermination: Determination?
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseNightscoutManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -88,7 +90,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/Network/TidepoolManager.swift

@@ -40,6 +40,8 @@ final class BaseTidepoolManager: TidepoolManager, Injectable {
 
     private var backgroundContext = CoreDataStack.shared.newTaskContext()
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseTidepoolManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -51,7 +53,7 @@ final class BaseTidepoolManager: TidepoolManager, Injectable {
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/UserNotifications/UserNotificationsManager.swift

@@ -65,6 +65,8 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
     private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
     private let backgroundContext = CoreDataStack.shared.newTaskContext()
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseUserNotificationsManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -78,7 +80,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()
 

+ 3 - 1
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -58,6 +58,8 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
     let context = CoreDataStack.shared.newTaskContext()
     let viewContext = CoreDataStack.shared.persistentContainer.viewContext
 
+    // Queue for handling Core Data change notifications
+    private let queue = DispatchQueue(label: "BaseWatchManager.queue")
     private var coreDataPublisher: AnyPublisher<Set<NSManagedObjectID>, Never>?
     private var subscriptions = Set<AnyCancellable>()
 
@@ -72,7 +74,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
 
         coreDataPublisher =
             changedObjectsOnManagedObjectContextDidSavePublisher()
-                .receive(on: DispatchQueue.global(qos: .background))
+                .receive(on: queue)
                 .share()
                 .eraseToAnyPublisher()