Kaynağa Gözat

Subscribe settings refactoring

Ivan Valkou 4 yıl önce
ebeveyn
işleme
935d9fc2f5

+ 9 - 4
FreeAPS/Sources/Modules/Base/BaseStateModel.swift

@@ -43,12 +43,17 @@ class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.P
         router.view(for: screen)
     }
 
-    func subscribeSetting<T: Equatable, U: Publisher>(_ keyPath: WritableKeyPath<FreeAPSSettings, T>, on settingPublisher: U)
-        where U.Output == T, U.Failure == Never
-    {
+    func subscribeSetting<T: Equatable, U: Publisher>(
+        _ keyPath: WritableKeyPath<FreeAPSSettings, T>,
+        on settingPublisher: U, initial: (T) -> Void, didSet: ((T) -> Void)? = nil
+    ) where U.Output == T, U.Failure == Never {
+        initial(settingsManager.settings[keyPath: keyPath])
         settingPublisher
             .removeDuplicates()
-            .assign(to: (\SettingsManager.settings).appending(path: keyPath), on: settingsManager)
+            .sink { [weak self] value in
+                self?.settingsManager.settings[keyPath: keyPath] = value
+                didSet?(value)
+            }
             .store(in: &lifetime)
     }
 }

+ 3 - 6
FreeAPS/Sources/Modules/CGM/CGMStateModel.swift

@@ -16,11 +16,12 @@ extension CGM {
 
         override func subscribe() {
             cgm = settingsManager.settings.cgm
-            uploadGlucose = settingsManager.settings.uploadGlucose
             transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
             currentCalendarID = storedCalendarID ?? ""
             calendarIDs = calendarManager.calendarIDs()
-            createCalendarEvents = settingsManager.settings.useCalendar
+
+            subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 }
+            subscribeSetting(\.uploadGlucose, on: $uploadGlucose) { uploadGlucose = $0 }
 
             $cgm
                 .removeDuplicates()
@@ -30,8 +31,6 @@ extension CGM {
                 }
                 .store(in: &lifetime)
 
-            subscribeSetting(\.uploadGlucose, on: $uploadGlucose)
-
             $createCalendarEvents
                 .removeDuplicates()
                 .flatMap { [weak self] ok -> AnyPublisher<Bool, Never> in
@@ -46,8 +45,6 @@ extension CGM {
                 .weakAssign(to: \.calendarIDs, on: self)
                 .store(in: &lifetime)
 
-            subscribeSetting(\.useCalendar, on: $createCalendarEvents)
-
             $currentCalendarID
                 .removeDuplicates()
                 .sink { [weak self] id in

+ 3 - 6
FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift

@@ -17,13 +17,10 @@ extension NightscoutConfig {
         override func subscribe() {
             url = keychain.getValue(String.self, forKey: Config.urlKey) ?? ""
             secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? ""
-            isUploadEnabled = settingsManager.settings.isUploadEnabled
-            useLocalSource = settingsManager.settings.useLocalGlucoseSource
-            localPort = Decimal(settingsManager.settings.localGlucosePort)
 
-            subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled)
-            subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource)
-            subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init))
+            subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled) { isUploadEnabled = $0 }
+            subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource) { useLocalSource = $0 }
+            subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init)) { localPort = Decimal($0) }
         }
 
         func connect() {

+ 8 - 16
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift

@@ -12,24 +12,16 @@ extension PreferencesEditor {
 
         override func subscribe() {
             preferences = provider.preferences
-            unitsIndex = settingsManager.settings.units == .mgdL ? 0 : 1
-            allowAnnouncements = settingsManager.settings.allowAnnouncements
 
-            insulinReqFraction = settingsManager.settings.insulinReqFraction
-            skipBolusScreenAfterCarbs = settingsManager.settings.skipBolusScreenAfterCarbs
+            subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 }
+            subscribeSetting(\.insulinReqFraction, on: $insulinReqFraction) { insulinReqFraction = $0 }
+            subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 }
 
-            subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements)
-            subscribeSetting(\.insulinReqFraction, on: $insulinReqFraction)
-            subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs)
-
-            $unitsIndex
-                .removeDuplicates()
-                .map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }
-                .sink { [weak self] units in
-                    self?.settingsManager.settings.units = units
-                    self?.provider.migrateUnits()
-                }
-                .store(in: &lifetime)
+            subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) {
+                unitsIndex = $0 == .mgdL ? 0 : 1
+            } didSet: { [weak self] _ in
+                self?.provider.migrateUnits()
+            }
 
             // MARK: - Main fields
 

+ 1 - 2
FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift

@@ -11,10 +11,9 @@ extension Settings {
         private(set) var buildNumber = ""
 
         override func subscribe() {
-            closedLoop = settingsManager.settings.closedLoop
             debugOptions = settingsManager.settings.debugOptions
 
-            subscribeSetting(\.closedLoop, on: $closedLoop)
+            subscribeSetting(\.closedLoop, on: $closedLoop) { closedLoop = $0 }
 
             broadcaster.register(SettingsObserver.self, observer: self)