From 9f550e8c3de62904db2651cacfc6685625edd41d Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Tue, 8 Jan 2019 12:02:18 -0600 Subject: [PATCH] Allow the settings screen to update when new readings come in --- CGMBLEKit/TransmitterManager.swift | 36 +++++++++++++++++++ .../TransmitterSettingsViewController.swift | 11 ++++++ 2 files changed, 47 insertions(+) diff --git a/CGMBLEKit/TransmitterManager.swift b/CGMBLEKit/TransmitterManager.swift index 1512858d..8ddfb806 100644 --- a/CGMBLEKit/TransmitterManager.swift +++ b/CGMBLEKit/TransmitterManager.swift @@ -41,9 +41,16 @@ public struct TransmitterManagerState: RawRepresentable, Equatable { } +public protocol TransmitterManagerObserver: class { + func transmitterManagerDidUpdateLatestReading(_ manager: TransmitterManager) +} + + public class TransmitterManager: TransmitterDelegate { private var state: TransmitterManagerState + private let observers = Locked(NSHashTable.weakObjects()) + public required init(state: TransmitterManagerState) { self.state = state self.transmitter = Transmitter(id: state.transmitterID, passiveModeEnabled: state.passiveModeEnabled) @@ -143,6 +150,7 @@ public class TransmitterManager: TransmitterDelegate { "dataIsFresh: \(dataIsFresh)", "providesBLEHeartbeat: \(providesBLEHeartbeat)", shareManager.debugDescription, + "observers.count: \(observers.value.count)", "" ].joined(separator: "\n") } @@ -151,6 +159,8 @@ public class TransmitterManager: TransmitterDelegate { if let manager = self as? CGMManager { delegate?.cgmManager(manager, didUpdateWith: result) } + + notifyObserversOfLatestReading() } // MARK: - TransmitterDelegate @@ -221,6 +231,32 @@ public class TransmitterManager: TransmitterDelegate { } +// MARK: - Observer management +extension TransmitterManager { + public func addObserver(_ observer: TransmitterManagerObserver) { + _ = observers.mutate { (observerTable) in + observerTable.add(observer as AnyObject) + } + } + + public func removeObserver(_ observer: TransmitterManagerObserver) { + _ = observers.mutate { (observerTable) in + observerTable.remove(observer as AnyObject) + } + } + + private func notifyObserversOfLatestReading() { + let observers = self.observers.value.objectEnumerator() + + for observer in observers { + if let observer = observer as? TransmitterManagerObserver { + observer.transmitterManagerDidUpdateLatestReading(self) + } + } + } +} + + public class G5CGMManager: TransmitterManager, CGMManager { public static let managerIdentifier: String = "DexG5Transmitter" diff --git a/CGMBLEKitUI/TransmitterSettingsViewController.swift b/CGMBLEKitUI/TransmitterSettingsViewController.swift index 6fdde34b..0641d3ae 100644 --- a/CGMBLEKitUI/TransmitterSettingsViewController.swift +++ b/CGMBLEKitUI/TransmitterSettingsViewController.swift @@ -24,6 +24,8 @@ class TransmitterSettingsViewController: UITableViewController { self.glucoseUnit = glucoseUnit super.init(style: .grouped) + + cgmManager.addObserver(self) } required init?(coder aDecoder: NSCoder) { @@ -350,6 +352,15 @@ class TransmitterSettingsViewController: UITableViewController { } +extension TransmitterSettingsViewController: TransmitterManagerObserver { + func transmitterManagerDidUpdateLatestReading(_ manager: TransmitterManager) { + DispatchQueue.main.async { + self.tableView.reloadData() + } + } +} + + private extension UIAlertController { convenience init(cgmDeletionHandler handler: @escaping () -> Void) { self.init(